这里只供基础的爬虫需求,协程是什么和gevent进阶用法就不赘述了
下载
pip install gevent
基本流程
1.打补丁
打补丁的意思是使用gevent的monkey类将python的一些标准库函数的阻塞调用都改成协作式的,这部分不懂可以不用管,在你的代码上固定下面两行就好。
from gevent import monkey
monkey.patch_all(ssl=False) #不对ssl打补丁,解决报requests超过最大递归深度的问题
如果你使用vscode,第一次运行可能会要求你添加环境变量"gevent": true
,添加方法为 打开vscode设置,就在左下角齿轮 搜索launch,然后选择“在settings.json中编辑” 然后就能跳转到launch项的设置 里面有一个"configurations"项,正常应该是一个空列表。 然后把下面这段设置加进去。
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"gevent": true
}
最终效果就像这样
"launch": {
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"gevent": true
}
],
"compounds": []
}
然后保存并重新打开你的项目就行了
2.创队列
使用库中自带的队列对象
from gevent.queue import Queue
queue = Queue()
queue.put_nowait(1)
queue.put_nowait(2)
a = queue.get_nowait()
print(a) #1
其中演示了队列的两个基本操作弹出和插入分别使用
queue.get_nowait()
queue.put_nowait()
然后将你需要逐步爬取的对象逐一放入队列中,就像这样
for url in url_list:
queue.put_nowait(url)
3.构建目标函数
构建你的爬虫任务函数,其中的url应该循环的通过get_nowait函数从队列中取出,就像这样
def crawler:
while not queue.empty():
url = queue.get_nowait()
res = requests.get(url)
4.构建任务
正常运行你的crawler函数就可以完成任务,但无法实现协程也就是加快速度的作用。 gevent允许你将同一个函数创建多个任务,每个任务是独立的,就像这样
for _ in range(3):
task =gevent.spawn(craeler)
task_list.append(task)
这段代码循环创建了三个任务对象,并添加到任务列表之中 相当于同样的蛋糕,之前只有一个人,现在有三个人待吃
5.任务,启动!
一切准备完毕,接下来就是宣布派对的开始,让三个人同时开始享用这一块蛋糕
gevent.joinall(task_list)
# 启动所有任务
以下是一段完整的示例代码
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
import gevent
#打补丁
from gevent import monkey
monkey.patch_all(ssl=False)
#创队列
from gevent.queue import Queue
queue = Queue()
urls = [
'https://www.baidu.com/', #百度
'https://www.sogou.com/', #搜狗
'https://cn.bing.com/', #必应
'https://www.taobao.com/' #淘宝
]
for url0 in urls:
queue.put_nowait(url0)
#写目标函数
def crawler():
while not queue.empty():
url = queue.get_nowait()
print(url,'开始爬取')
res = requests.get(url = url,headers=headers)
print(url,res.status_code,' 爬取完成!')
#创建任务
crawler()
task_list = []
for _ in range(2):
task = gevent.spawn(crawler)
task_list.append(task)
# 启动
gevent.joinall(task_list)
如果你运行遇到问题,请检查或尝试
- 打补丁一步中有没有设置ssl=false
- vscode环境是否添加了
"gevetn: true"
- 还是不行试着安装
eventlet
库pip3 install eventlet