gevent模块-多协程异步

该博客介绍了如何利用gevent库实现Python爬虫的并发处理,通过创建任务队列和协程,提高爬取多个网站的效率。示例展示了在遇到等待时切换任务,避免阻塞,同时讲解了如何结合queue模块处理大量任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

可以进行多个爬虫任务,当一个任务在执行中遇到等待,就先执行另一个任务,提高效率,节省时间。

安装

Pip install gevent

使用

在这里插入图片描述

from gevent import monkey
#从gevent库里导入monkey模块
monkey.patch_all()
#monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步

import gevent
import time
import requests
#导入gevent、time、requests

start = time.time()
#记录程序开始时间

url_list = [
    "https://www.kaikeba.com/",
    "https://www.youkuaiyun.com/",
    "https://www.json.cn/",
    "https://cn.bing.com/",
    "https://www.jianshu.com/",
    "http://www.techweb.com.cn/",
    "https://www.bilibili.com/",
    "https://www.huxiu.com/"
]
#把8个网站封装成列表

def crawler(url):
#定义一个crawler()函数。
    r = requests.get(url)
    #用requests.get()函数爬取网站。
    print(url,time.time()-start,r.status_code)
    #打印网址、请求运行时间、状态码

tasks_list = [ ]
#创建空的任务列表。

for url in url_list:
#遍历url_list
    task = gevent.spawn(crawler,url)
    #gevent只能处理gevent的任务对象,不能直接调用普通函数,故用gevent.spawn()函数创建任务。gevent.spawn()的参数需为要调用的函数名及该函数的参数
    tasks_list.append(task)
    #往任务列表添加任务

gevent.joinall(tasks_list)
#执行任务列表里的所有任务,就是让爬虫开始爬取网站。
end = time.time()
#记录程序结束时间。
print(end-start)
#打印程序最终所需时间。

queue模块

当任务量特别多时,建议将queue模块与协程搭配使用。
在这里插入图片描述
在这里插入图片描述

from gevent import monkey
#从gevent库里导入monkey模块
monkey.patch_all()
#monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。

import gevent
import time
import requests
from gevent.queue import Queue
#从gevent库里导入queue模块

start = time.time()

url_list = [
    "https://www.kaikeba.com/",
    "https://www.youkuaiyun.com/",
    "https://www.json.cn/",
    "https://cn.bing.com/",
    "https://www.jianshu.com/",
    "http://www.techweb.com.cn/",
    "https://www.bilibili.com/",
    "https://www.huxiu.com/"
]

work = Queue()
#创建队列对象,并赋值给work
for url in url_list:
#遍历url_list
    work.put_nowait(url)
    #用put_nowait()函数可以把网址都放进队列里

def crawler():
    while not work.empty():
    #当队列不是空的时候,就执行下面的程序
        url = work.get_nowait()
        #用get_nowait()函数可以把队列里的网址都取出
        r = requests.get(url)
        #用requests.get()函数抓取网址
        print(url,work.qsize(),r.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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值