平时写的爬虫,有多个url时,只能一个一个请求,这叫同步的爬虫方式,速度耶比较慢。
为了解决这样的问题,一种非抢占式的异步技术被创造了出来,这种方式叫多协程(在此,多是多个的意思)。
它的原理是:一个任务在执行过程中,如果遇到等待,就先去执行其他的任务,当等待结束,再回来继续之前的那个任务。在计算机的世界,这种任务来回切换得非常快速,看上去就像多个任务在被同时执行一样。
所以,要实现异步的爬虫方式的话,需要用到多协程。在它的帮助下,我们能实现前面提到的“让多个爬虫替我们干活”。
用gevent模块可以让爬虫同时去请求多个url,如下
from gevent import monkey
monkey.patch_all()
#monkey的patch_all()能把程序变成协作式运行,可以帮助程序实现异步
#一定要先执行这一步,再执行接下来的import,不然会报错
import gevent
import requests
url_list = ['https://www.baidu.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/']
#把8个网站封装成列表。
def crawler(url):
r = requests.get(url)
print(r.status_code)
task_list = [] #创建空的任务列表
for url in url_list:
task = gevent.spawn(crawler,url)
# 用gevent.spawn()函数创建任务,
# 因为gevent只能处理gevent的任务对象,不能直接调用普通函数,所以需要借助ge

本文介绍了如何使用gevent和queue在Python中实现多协程的异步爬虫。通过gevent.spawn()创建任务并利用gevent.join_all()进行并发执行,解决了同步爬虫速度慢的问题。在处理大量请求时,采用队列存储URL,多个爬虫并行处理,模拟多柜员服务客户的方式,避免对服务器造成过大压力,以实现更高效的爬取效率。
最低0.47元/天 解锁文章
373





