首页 > 其他分享 >gevent实现协程爬虫

gevent实现协程爬虫

时间:2024-04-17 13:11:57浏览次数:22  
标签:task nowait get url 爬虫 queue gevent 协程

这里只供基础的爬虫需求,协程是什么和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)

如果你运行遇到问题,请检查或尝试

  1. 打补丁一步中有没有设置ssl=false
  2. vscode环境是否添加了"gevetn: true"
  3. 还是不行试着安装eventletpip3 install eventlet

标签:task,nowait,get,url,爬虫,queue,gevent,协程
From: https://www.cnblogs.com/kabaiye/p/18140375

相关文章

  • csharp selenium HtmlAgilityPack 爬虫 网页解析 微信公众号
    Wechat.Crawler/App/App.csproj<ProjectSdk="Microsoft.NET.Sdk"><ItemGroup><ProjectReferenceInclude="..\Blog\Blog.csproj"/></ItemGroup><ItemGroup><NoneUpdate="nlog.config&......
  • 爬虫入门
    爬豆瓣importrequestshead={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/98.0.4758.139Safari/537.36"}#修改请求头,伪装成浏览器#response=requests.get("http://books.toscrape.com/",h......
  • Python爬虫学习
    基础语法字符串单引号双引号都行,是为了打印出引号才设计出两种的s1='"haha"'s2="'haha'"print(s1)print(s2)#结果是:"haha"'haha'事实上就近匹配,比如s=''haha''会被解析成前面俩一对后面俩一对s='''haha&......
  • 协程
    PHP-FPM的运作模式在聊协程是什么之前,我们先聊聊传统PHP-FPM架构的运作模式,PHP-FPM是一个多进程的FastCGI管理程序,是绝大多数PHP应用所使用的运行模式。假设我们使用Nginx提供HTTP服务(Apache同理),所有客户端发起的请求最先抵达的都是Nginx,然后Nginx通过FastCGI......
  • 14--爬虫回顾和重点经验
    01.浏览器#一个网页的加载全过程1.服务器端渲染html的内容和数据在服务器进行融合.在浏览器端看到的页面源代码中.有你需要的数据2.客户端(浏览器)渲染html的内容和数据进行融合是发生在你的浏览器上的.这个过程一般通过脚本来完成(javascript)我们......
  • GB标准文档爬虫下载程序
    """author:babyfengfjx"""importrequestsimportrefromtimeimportsleepfrombs4importBeautifulSoupimportshelveheaders={"Accept":"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8&......
  • 使用docker部署基于selenium和chrome-headless的爬虫
    使用docker部署基于selenium和chrome-headless的爬虫无论是测试还是爬虫的一些工作,有时候都会用到selenium去对chrome执行自动化操作,这里介绍一下如何使用docker快捷方便的部署相关应用。1.selenium+chrome镜像通过dockersearchselenium我们发现,有一个docker镜像叫做sele......
  • python爬虫—学习笔记-3
    python爬虫—学习笔记-3ps:因为本人近一个月住院,文章为队友所著。此次学习内容为如何搭建服务器1.打开pycharm,创建目录server在设置中的Python解释器中安装Flask2.在创建的server1中输入本节课所学代码在网页中输入ip端口号子目录本机访问127.0.0.1:5000/子目录外部......
  • python爬虫—学习笔记-2
    python爬虫—学习笔记-2ps:因为本人近一个月住院,文章为队友所著。任务获取豆瓣网站内容。单页获取网址:https://movie.douban.com/top250获取网页信息代码:importrequestsurl="https://movie.douban.com/top250"headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;......
  • 爬虫之数据神器10---Peewee实现ORM的核心原理
    前言:继续上一篇:爬虫之数据神器9---Peewee集成Django/Flask框架详解-CSDN博客本章主要讲一些原理方面的东西,帮助大家在项目中可以更好的理解!正文:一、模型定义在Peewee中,模型的定义是通过模型元类(ModelMetaclass)实现的。Peewee利用Python的元类机制,在模型类定义中使......