当我们想要爬取的是成千上万条的数据,那么就会遇到一个问题:因为程序是一行一行依次执行的缘故,要等待很久,我们才能拿到想要的数据。
既然一个爬虫爬取大量数据要爬很久,那我们能不能让多个爬虫一起爬取?
这样无疑能提高爬取的效率,就像一个人干不完的活儿,组个团队一起干,活一下被干完了。
这是一个很好的思路——让多个爬虫帮我们干活。具体怎么用Python实现这事呢?
我们可以用协程和队列。
用协程和队列爬取搜狗、新浪、天猫等8个网站。
from gevent import monkey # 从gevent库里导入monkey模块 monkey.patch_all() # 把程序变成协作式运行,可以帮助程序实现异步 import gevent,time,requests from gevent.queue import Queue #从gevent库里导入queue模块 start = time.time() # 记录开始时间 url_list = ['https://www.sogou.com/', 'https://www.sina.com.cn/', 'http://www.sohu.com/', 'https://www.qq.com/', 'https://www.163.com/', 'http://www.iqiyi.com/', 'https://www.tmall.com/', 'http://www.ifeng.com/'] work = Queue() # 创建队列对象,并赋值给work for url in url_list: work.put_nowait(url) # 用put_nowait()函数可以把网址都放进队列里 def crawler(): while not work.empty(): # 当队列不是空的时候,就执行下面的程序 url = work.get_nowait() # 用get_nowait()函数可以把队列里的网址都取出 res = requests.get(url) # 用requests.get()函数抓取网站 print(url,work.qsize(),res.status_code) # 打印网址、队列长度、抓取请求的状态码 tasks_list = [] # 创建空的任务列表 for x in range(2): # 创建2个爬虫 task = gevent.spawn(crawler) # 用gevent.spawn()函数创建执行crawler()函数的任务 tasks_list.append(task) # 往任务表添加任务 gevent.joinall(tasks_list) # 用gevent.joinall方法,执行任务列表里的所有任务,让爬虫开始爬取网站 end = time.time() # 记录结束时间 print(end-start) # 输出时长以上。