练习介绍
要求:
请使用多协程和队列,爬取时光网电视剧TOP100的数据(剧名、导演、主演和简介),并用csv模块将数据存储下来。
时光网TOP100链接:http://www.mtime.com/top/tv/top100/
目的:
1.练习掌握gevent的用法
2.练习掌握queue的用法
from gevent import monkey#gevent从库里导入monkey模块
monkey.patch_all()#能把程序变成协作式运行,就是可以帮助程序实现异步
import gevent,time,requests,csv
from gevent.queue import Queue#gevent从库里导入queue模块
from bs4 import BeautifulSoup
work=Queue()#创建队列对象,并赋值给work
url_1='http://www.mtime.com/top/tv/top100/'
work.put_nowait(url_1)#用put_nowait()函数把url_1也就是第一页的网址放进队列里
for i in range(2,11):
url_2='http://www.mtime.com/top/tv/top100/index-{}.html'.format(i)#2-10页的网址循环遍历
work.put_nowait(url_2)#用put_nowait()函数把2-10页的网址都放进队列里。
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()#get_nowait()函数可以把队列里的网址都取出。
res=requests.get(url,headers=headers)#用requests.get()函数抓取网址。
html=res.text
soup=BeautifulSoup(html,'html.parser')
items=soup.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[:2]=='导演':
director=data.text[3:].strip()
elif data.text[:2]=='主演':
actor=data.text[3:].strip()
else:
remarks = data.text.strip()
writer.writerow([name,director,actor,remarks])
csv_file=open('TVtop100.csv','w',newline='',encoding='utf-8-sig')
writer=csv.writer(csv_file)
writer.writerow(['电视剧名','导演','主演','简介'])
tasks_list=[]#创建空的任务列表
for x in range(3):#相当于创建了3个爬虫
task=gevent.spawn(crawler)#用gevent.spawn()函数创建执行crawler()函数的任务
tasks_list.append(task)
gevent.joinall(tasks_list)#用gevent.joinall方法,执行任务列表里的所有任务,就是让爬虫开始爬取网站。
csv_file.close()