想提高爬虫效率?aiohttp 了解下
本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享
对于爬虫程序,我们往往会很关注其爬虫效率。影响爬虫效率有几个因素有,是否使用多线程,I/O 操作,是否同步执行等。其中 I/O 操作、同步执行是最影响爬虫效率的。
众所周知,Requests 库一个优秀的 HTTP 库,通过它可以非常简单地发起 HTTP 请求。不过,这个库所执行的网络请求都是同步。当爬虫程序进程获得 CPU 的时间片时,如果程序在进行 I/O 操作(例下载图片),在这段 IO 执行的时间里,CPU 处于空闲中,这样会造成 CPU 的计算能力就被浪费了。
如果 CPU 能将等待时间利用起来,那么爬虫效率就提高了。那就需要对程序进行改造,将 I/O 同步操作变成异步操作。本文内容是介绍一个强大的异步 I/O 操作的库 —— aiohttp。
1 aiohttp 介绍
说到 aiohttp ,不得不说下 asyncio 。asyncio 是 Python 3.4 版本引入的标准库。它工作模式是单线程并发,使用协同执行 I/O 操作。asyncio 的编程模型就是一个消息循环。我们从 asyncio 模块中直接获取一个 EventLoop 的引用,然后把需要执行的协程扔到 EventLoop 中执行,就实现了异步 IO。
使用 asyncio 实现一个异步函数 hello() 的例子:
import asyncio@asyncio.coroutine # 修饰符,等同于 asyncio.coroutine(hello())
def hello():print("Hello world!")# 异步调用asyncio.sleep(1):r = yield from asyncio.sleep(1)print("Hello again!")# 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()
复制代码
而 aiohttp 则是基于 asyncio 实现的 HTTP 框架。 aiohttp 全称是 Async http client/server framework。翻译成中文是异步 HTTP 的客户端/服务器框架。从名字中,我们可知 aiohttp 是分为服务器端和客户端,专门异步处理 HTTP 的请求。
2 aiohttp 安装
安装 aiohttp 可以通过 pip 方式安装,在终端中执行安装命令即可。
pip install aiohttp
复制代码
3 async/await 语法
前面我们讲到异步 I/O 的用法,但是声明异步函数比较繁琐,还需要依赖 yield 语法。在 Python 3.5 中,引入了 async/await 关键字,使得异步回调的写法更加直观和人性化。
在函数 def 之前增加关键字async,表示这个函数是异步函数。相当于替代语法@asyncio.coroutine
。具体例子例如:
async def hello():print("Hello World!")
复制代码
另外使用 await 替换了 yield from
, 表示这部分操作为异步操作。
async def hello():print("Hello World!")r = await asyncio.sleep(1)print("Hello again!")
复制代码
最后执行异步函数,还是需要用到 EventLoop 引用,然后利用协程执行异步函数。最终的代码如下:
import asyncioasync def hello():print("Hello world!")r = await asyncio.sleep(1)print("Hello again!")if __name__ == '__main__':loop = asyncio.get_event_loop()tasks = [hello(), ]loop.run_until_complete(asyncio.wait(tasks))loop.close()
复制代码
运行结果如下:
Hello world!
>> 会暂停一秒钟
Hello again!
复制代码
4 aiohttp 基本用法
我们使用 aiohttp 以 GET 方式向httpbin.org
网站发起一个 HTTP 请求。因为是 aiohttp 是异步处理 HTTP 请求。所以还必须遵循 Python 的异步函数语法,即需使用 async/await 语法。
使用 aiohttp 发起一个 HTTP 请求,具体编写可以分为以下几步: 1)使用 async 定义异步函数 2)通过 aiohttp.ClientSession 获取一个 session 对象 3)用该 session 对象以 GET、POST、PUT 等方式去请求网页 4)最后获取 EventLoop 引用,执行异步函数。
import asyncio
import aiohttp# 定义异步函数 main()
async def main():# 获取 session 对象async with aiohttp.ClientSession() as session:# get 方式请求 httbin async with session.get('http://httpbin.org/get') as response:print(response.status)print(await response.text())loop = asyncio.get_event_loop()
loop.run_until_complete(main())
复制代码
aiohttp 支持自定义 headers、设置超时时间、设置代理、自定义 cookie 等。
import asyncio
import aiohttpurl = 'http://httpbin.org/post'
headers = {'User-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
}data = {'data': 'person data',
}# 定义异步函数 main()
async def main():# 获取 session 对象async with aiohttp.ClientSession() as session:# post 方式请求 httbinasync with session.post(url=url, headers=headers, data=data) as response:print(response.status)print(await response.text())loop = asyncio.get_event_loop()
loop.run_until_complete(main())
复制代码
关于 aiohttp 更多用法,可以执行阅读官网文档。说句实话,aiohttp 跟 Requests 的用法大同小异。如果你已经学会了 Requests 库,很快就能掌握 aiohttp 的用法。
本文首发于微信公众号,原文地址是 想提高爬虫效率?aiohttp 了解下。随时欢迎转载文章, 转载请联系号主开通白名单,尊重作者的原创。本人微信公众号「极客猴」,每周分享 Python 原创干货。涉及网络爬虫、数据分析、web 开发等方向。
想提高爬虫效率?aiohttp 了解下相关推荐
- 提高爬虫效率aiohttp
众所周知,Requests 库一个优秀的 HTTP 库,通过它可以非常简单地发起 HTTP 请求.不过,这个库所执行的网络请求都是同步.当爬虫程序进程获得 CPU 的时间片时,如果程序在进行 I/O ...
- 听说你想提高开发效率,快来看看这些idea最实用的快捷键,让你的开发如虎添翼!
前言 隔壁工位的老汪今天又双叒叕提前下班了,而勤奋的小哈频频加班却效果不佳.小哈甚是不解,向老汪请教.老汪笑着说:"哈~我只是在开发时偷偷用了这些快捷键,快捷键能够让我的开发事半功倍,这 ...
- 要想提高工作效率,请拒绝做这7种事
PS:原文出自Medium上的CamMi Pham的 7 Things You Need To Stop Doing To Be More Productive, Backed B ...
- 要想提高工作效率,请拒绝做这 7 种事
忙未必就说明你有生产力.要想有生产力,更多的是要管理好你的精力而不是时间.要经营好你的生活.我们需要学会花费最小的精力得到最大的收益.不干以下 7 件事,我把每周的工作时间从 80 小时缩短到了 40 ...
- pythonselenium提高爬虫效率_[编程经验] Python中使用selenium进行动态爬虫
Hello,大家好!停更了这么久,中间发生了很多事情,我的心情也发生了很大的变化,看着每天在增长的粉丝,实在不想就这么放弃了,所以以后我会尽量保持在一周一篇的进度,与大家分享我的学习点滴,希望大家可以 ...
- 提高爬虫效率的小工具——定时发邮件
如果不想看文字的话,这里面由我的b站详细讲解: https://www.bilibili.com/video/av75377135?p=3 为什么要用它 给大家举一个例子:爬虫都会花一定的时间,你难免 ...
- python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘
之前文章中所介绍的爬虫都是对单个URL进行解析和爬取,url数量少不费时,但是如果我们需要爬取的网页url有成千上万或者更多,那怎么办? 使用for循环对所有的url进行遍历访问? 嗯,想法很好,但是 ...
- 使用selenium设置firefox不加载图片增加加载速度提高爬虫效率
from selenium import webdriver options=webdriver.FirefoxProfile() options.set_preference('permission ...
- python如何并发上千个get_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘...
匿名说道: # coding:utf-8 import requests from bs4 import BeautifulSoup url = 'https://sou.zhaopin.com/jo ...
最新文章
- 最新SOTA模型和实现代码
- android 按照星期 时间 定时_Spring Boot实现定时任务的四种方式
- 京东软件测试工程师招聘,京东商城软件测试面试经验
- JAVA订单的输入输出_Java的输入/输出操作
- Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果
- JavaScrip有哪些优点
- 工业级光纤收发器九大技术优势介绍
- python数组就是列表吗,Python:数组与列表
- java设计模式--基础思想总结--抽象类与架构设计思想
- MyBatis学习(四)MyBatis缓存
- 【软件工具使用】高效使用 Visio 绘图
- PS制作gif动图教程
- C# winform 魔兽MH全图制作教程(1): 开发准备工作
- 在图形用户登录界面输入正确用户名与密码后,闪了一下(即将要登录进去那一刹那),它NND给我蹦出来了!
- 鏈接腳本、靜態庫、共享庫
- 医学影像研究的重要性 计算机,计算机辅助医学影像诊查之关键学习技术研究.doc...
- 这是我见过最好的JVM笔记,拿到阿里offer后我哭了
- CCS11用户界面介绍2
- java 调用博思得条码打印机
- 批量采集多个淘宝商品的洋淘买家秀图片并统一保存
热门文章
- a.x=a={n:1} JS中使用连等赋值操作
- 求矩阵的连通分支数问题
- 自动接单小票打印机是怎么实现的?
- 【Brain】登上国际顶刊 PNAS!科学家从理论计算机出发,提出了一个意识模型——「有意识的图灵机」...
- python拆分excel行_Python将一个Excel拆分为多个Excel
- 怎么把一个excel拆分成多个
- 跟着Code走,详解Symbian OS API调用过程
- H3C交换机结合深信服AC做802.1x认证
- ceres之cholesky求解器
- C2039	“OpenNI2Grabber”: 不是“pcl”的成员