写python协程时使用gevent模块和queue模块可以大大提高爬虫速度。在同时爬取多个网站时,原来用for循环一个网站一个网站按循序顺序爬,就像先烧饭后烧菜,两个步骤异步进行。使用多协程可以让爬虫自己选择爬取顺序,就像边烧饭边烧菜,两个步骤同步进行,速度自然快了。
不多说了,来看下代码吧:

from gevent import monkeymonkey.patch_all()#打上多协程布丁,下面的程序就可以执行多协程了import requests,gevent,csvfrom gevent.queue import Queuefrom bs4 import BeautifulSoup#把所有URL都放到一个列表里:url_list=[]i=1for i in range(10): i=i+1 url='http://www.mtime.com/top/tv/top100/index-'+str(i)+'.html' url_list.append(url)#第一个url和别的不一样,需要单独加入url_0='http://www.mtime.com/top/tv/top100/'url_list.append(url_0)headers={ 'User-Agent': }csv_file=open('时光网电影列表.csv','a+',newline='',encoding='utf-8')writer=csv.writer(csv_file)file_head=['电影名称','导演','主演','简介']writer.writerow(file_head)def list(movies): for movie in movies: title=movie.find('h3',class_="px14 pb6").find('a').text acts=movie.find_all('p') try: dic=acts[0].text except IndexError: dic='none' try: actor=acts[1].text except IndexError: actor='none' try: bief=movie.find('p',class_="mt3").text except AttributeError: bief='none' writer.writerow([title,dic,actor,bief])#所有url都放到‘不用等’房间里:work=Queue()for url in url_list: work.put_nowait(url)#爬虫对象:def crawler(): while not work.empty(): url=work.get_nowait() res=requests.get(url,headers=headers) soup=BeautifulSoup(res.text,'html.parser') movies=soup.find_all('div',class_="mov_con") list(movies) print(url,work.qsize(),res.status_code) #建立多协程任务,任务不用建太多,2个就够,太多的话对方服务器承受不了tasks_list=[]for x in range(2): task=gevent.spawn(crawler) tasks_list.append(task)gevent.joinall(tasks_list)csv_file.close()