题目要求
项目目标:使用多协程和队列,爬取时光网电视剧TOP100的数据(剧名、导演、主演和简介),并用csv模块将数据存储下来。时光网TOP100链接:http://www.mtime.com/top/tv/top100/
做题步骤
1、首先,打开链接,将第1-10页的链接放进队列。
2、创建crawler()爬虫函数
用get_nowait()函数可以把队列里的网址都取出。从浏览器的F12开发者工具中Network下找到请求网址的headers信息,通过requests.get()方法对目标网站发起请求。
从浏览器的F12开发工具Elements下找到我们需要的数据:剧名、导演、主演和简介。(通过左上角的箭头可快速找到我们需要的数据)通过查找,发现我们需要的数据都在【div class="mov_point"】标签下(如下图所示)。因此通过find_all函数查找所有【div class="mov_point"】标签。
逐一查找我们所需要的数据。展开【div class="mov_point"】标签,发现电剧名就在【div class="mov_point"】标签下的【a】标签下,如下图所示。
以相同的方法发现,我们需要的其他数据都在【div class="mov_point"】标签下的【p】标签下,此时我们的程序中需要用到判断语句【if】找到我们需要的数据。
3、创建多个爬虫
由于我们要爬取的数据较多,所以建议使用多个爬虫异步进行数据爬取。
4、创建csv文件并将爬取的数据写入csv文件中
具体程序如下:
from gevent import monkey
monkey.patch_all() # 把程序变成协作式运行,就是可以帮助程序实现异步。
import gevent,time,requests,csv
from gevent.queue import Queue
from bs4 import BeautifulSoup
work = Queue()
# 创建队列,把任务存储井队列里
url_1 = 'http://www.mtime.com/top/tv/top100/'
work.put_nowait(url_1) # 把网址放进队列里。
for i in range(2,11):
urls = 'http://www.mtime.com/top/tv/top100/index-{}.html'.format(i)
work.put_nowait(urls)
# 定义爬取函数,从队列里提取出刚刚存储进去的网址,并获取需要的数据
def crawler():
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
while not work.empty():
url = work.get_nowait() # 把队列里的网址都取出。
res = requests.get(url,headers=headers)
bs = BeautifulSoup(res.text,'html.parser')
items = bs.find_all('div',class_='mov_con')
for item in items:
name = item.find('a').text
datas = item.find_all('p')
for data in datas:
if data.text[:3]=='导演:':
director=data.text[3:].strip()
elif data.text[:3]=='主演:':
actors = data.text[3:].strip()
else:
remarks = data.text.strip()
writer.writerow([name,director,actors,remarks])
task_list = []
for x in range(4): # 创建4个爬虫
task = gevent.spawn(crawler) # 创建执行crawler()函数的任务。
task_list.append(task)
csv_file = open('TVtop100.csv','w',newline='',encoding='utf-8-sig')
writer = csv.writer(csv_file)
writer.writerow(['电视剧','导演','主演','简介'])
gevent.joinall(task_list) #执行任务列表里的所有任务,就是让爬虫开始爬取网站。
csv_file.close()