查看原文
其他

使用gevent实现高效异步请求

2017-12-01

作者 大邓

《python异步爬虫详解》一文代码太过繁琐,谢谢

学习学习再学习”(博客园:Alex的盗版学生)

提到的使用猴子补丁的意见。今天重写一下。

一、同步与异步

异步编程可以大幅度的提高系统的吞吐量,提高单位时间内发出的请求数目。之前大邓写的爬虫都是同步,就是对aurl发起请求,等待响应。然后再访问burl,等待响应。。。

大量的时间消耗在等待上,如果能近似的同时对多个网址发起请求,等待响应,速度回快很多倍。这里的同时其实是为了让大家便于理解,其实所谓的同时也是有先后顺序的,所以叫异步。

文字描述太别扭,我们水平方向代表时间

#同步编程(同一时间只能做一件事,做完了才能做下一件事情)<-a_url-><-b_url-><-c_url->#异步编程 (可以近似的理解成同一时间有多个事情在做,但有先后)<-a_url->  <-b_url->    <-c_url->      <-d_url->        <-e_url->          <-f_url->            <-g_url->              <-h_url->                <--i_url-->                  <--j_url-->

你看同步编程同样的时间访问了3个网址,但是异步编程访问的效率提高了很多倍。

二、功能实现

2.1gevent简介

gevent是一个python的并发库,它为各种并发和网络相关的任务提供了整洁的API。

gevent中用到的主要模式是greenlet,它是以C扩展模块形式接入Python的轻量级协程。 greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

2.2 猴子补丁

昨天的分享的文章中也发现了requests库是阻塞式的,也就无法像上面图形那种,将requests同步更改为异步。只有将requests库阻塞式更改为非阻塞,异步操作才能实现。

而gevent库中的猴子补丁(monkey patch),gevent能够修改标准库里面大部分的阻塞式系统调用。这样在不改变原有代码的情况下,将应用的阻塞式方法,变成协程式的(异步)。

三、代码

from gevent import monkey
import gevent
import requests
import time monkey.patch_all()

def req(url):    print(url)    resp = requests.get(url)    print(resp.status_code,url)        
def synchronous_times(urls):    """同步请求运行时间"""    start = time.time()    for url in urls:        req(url)    end = time.time()    print('同步执行时间 {} s'.format(end-start))    
def asynchronous_times(urls):    """异步请求运行时间"""    start = time.time()    gevent.joinall([gevent.spawn(req,url) for url in urls])    end = time.time()    print('异步执行时间 {} s'.format(end - start))        
urls = ['https://book.douban.com/tag/小说','https://book.douban.com/tag/科幻',        'https://book.douban.com/tag/漫画','https://book.douban.com/tag/奇幻',        'https://book.douban.com/tag/历史','https://book.douban.com/tag/经济学']

synchronous_times(urls)
asynchronous_times(urls)
https://book.douban.com/tag/小说 200 https://book.douban.com/tag/小说 https://book.douban.com/tag/科幻 200 https://book.douban.com/tag/科幻 https://book.douban.com/tag/漫画 200 https://book.douban.com/tag/漫画 https://book.douban.com/tag/奇幻 200 https://book.douban.com/tag/奇幻 https://book.douban.com/tag/历史 200 https://book.douban.com/tag/历史 https://book.douban.com/tag/经济学 200 https://book.douban.com/tag/经济学 同步执行时间 6.054782867431641 s https://book.douban.com/tag/小说 https://book.douban.com/tag/科幻 https://book.douban.com/tag/漫画 https://book.douban.com/tag/奇幻 https://book.douban.com/tag/历史 https://book.douban.com/tag/经济学 200 https://book.douban.com/tag/历史 200 https://book.douban.com/tag/漫画 200 https://book.douban.com/tag/小说 200 https://book.douban.com/tag/经济学 200 https://book.douban.com/tag/奇幻 200 https://book.douban.com/tag/科幻 异步执行时间 1.114253044128418 s

异步请求效率是同步请求近5倍!!!再次感谢 

微信昵称:"学习学习再学习”(博客园:Alex的盗版学生)

教程及代码下载

链接: https://pan.baidu.com/s/1miwyB5u 密码: 4ffj

觉得有收获可以送支鹅毛信哦~(^_^)


历史文章:

数据采集

selenium驱动器配置详解

爬虫神器PyQuery的使用方法

pyquery爬取豆瓣读书

pyquery一些自定义的用法

【视频】猫途鹰网站评论数据抓取

【视频讲解】在scrapy框架中如何使用selenium?

【实战视频】使用scrapy写爬虫-爬知乎live

简易SQLite3数据库学习

【视频教程】对视频进行基本操作

【视频】抓包小练习-B站评论数据抓取

fake-useragent库:值得花2分钟学习的库

【视频】爬取饿了么平台上的门店信息

如何抓取视频资源-以头条视频为例

当爬虫遭遇验证码,怎么办

【视频】手把手教你抓美女~

【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”

【视频】快来get新技能--抓包+cookie,爬微博不再是梦

【视频教程】用python批量抓取简书用户信息

用Python抓取百度地图里的店名,地址和联系方式

文本处理分析

gensim:用Word2Vec进行文本分析

RAKE:快速自动抽取关键词算法

对于中文,nltk能做哪些事情

用nltk计算词语间的点互信息值PMI

用SenticNet库做细粒度情感分析

如何对csv文件中的文本数据进行分析处理

复杂网络分析数据准备篇

文本分析之网络关系

用词云图解读“于欢案”

基于共现发现人物关系的python实现

用pyecharts制作词云图

图片数据处理

OpenCV:快速入门图片人脸识别

好玩的OpenCV:图片操作的基本知识(1)

好玩的OpenCV:图像操作的基本知识(2)

OpenCV:计算图片有多色

如何对数据进行各种排序?

其他

迅雷不给力,我DIY了个下载器

【视频】初学者必看:python环境配置

开扒皮自己微信的秘密

初识装饰器函数

计算运行时间-装饰器实现

花十分钟,给爱机安装个MongoDB

chardet库:轻松识别文件的编码格式

使用Python登录QQ邮箱发送QQ邮件

8行代码实现微信聊天机器人

使用Python+OpenCV进行面部合

十分钟入门常用的json库


优雅简洁的列表推导式

【资源帖】简单易懂的机器学习视频教程


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存