本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享

对于爬虫程序,我们往往会很关注其爬虫效率。影响爬虫效率有几个因素有,是否使用多线程,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 了解下相关推荐

  1. 提高爬虫效率aiohttp

    众所周知,Requests 库一个优秀的 HTTP 库,通过它可以非常简单地发起 HTTP 请求.不过,这个库所执行的网络请求都是同步.当爬虫程序进程获得 CPU 的时间片时,如果程序在进行 I/O ...

  2. 听说你想提高开发效率,快来看看这些idea最实用的快捷键,让你的开发如虎添翼!

    前言   隔壁工位的老汪今天又双叒叕提前下班了,而勤奋的小哈频频加班却效果不佳.小哈甚是不解,向老汪请教.老汪笑着说:"哈~我只是在开发时偷偷用了这些快捷键,快捷键能够让我的开发事半功倍,这 ...

  3. 要想提高工作效率,请拒绝做这7种事

    PS:原文出自Medium上的CamMi Pham的           7 Things You Need To Stop Doing To Be More Productive, Backed B ...

  4. 要想提高工作效率,请拒绝做这 7 种事

    忙未必就说明你有生产力.要想有生产力,更多的是要管理好你的精力而不是时间.要经营好你的生活.我们需要学会花费最小的精力得到最大的收益.不干以下 7 件事,我把每周的工作时间从 80 小时缩短到了 40 ...

  5. pythonselenium提高爬虫效率_[编程经验] Python中使用selenium进行动态爬虫

    Hello,大家好!停更了这么久,中间发生了很多事情,我的心情也发生了很大的变化,看着每天在增长的粉丝,实在不想就这么放弃了,所以以后我会尽量保持在一周一篇的进度,与大家分享我的学习点滴,希望大家可以 ...

  6. 提高爬虫效率的小工具——定时发邮件

    如果不想看文字的话,这里面由我的b站详细讲解: https://www.bilibili.com/video/av75377135?p=3 为什么要用它 给大家举一个例子:爬虫都会花一定的时间,你难免 ...

  7. python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘

    之前文章中所介绍的爬虫都是对单个URL进行解析和爬取,url数量少不费时,但是如果我们需要爬取的网页url有成千上万或者更多,那怎么办? 使用for循环对所有的url进行遍历访问? 嗯,想法很好,但是 ...

  8. 使用selenium设置firefox不加载图片增加加载速度提高爬虫效率

    from selenium import webdriver options=webdriver.FirefoxProfile() options.set_preference('permission ...

  9. python如何并发上千个get_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘...

    匿名说道: # coding:utf-8 import requests from bs4 import BeautifulSoup url = 'https://sou.zhaopin.com/jo ...

最新文章

  1. 最新SOTA模型和实现代码
  2. android 按照星期 时间 定时_Spring Boot实现定时任务的四种方式
  3. 京东软件测试工程师招聘,京东商城软件测试面试经验
  4. JAVA订单的输入输出_Java的输入/输出操作
  5. Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果
  6. JavaScrip有哪些优点
  7. 工业级光纤收发器九大技术优势介绍
  8. python数组就是列表吗,Python:数组与列表
  9. java设计模式--基础思想总结--抽象类与架构设计思想
  10. MyBatis学习(四)MyBatis缓存
  11. 【软件工具使用】高效使用 Visio 绘图
  12. PS制作gif动图教程
  13. C# winform 魔兽MH全图制作教程(1): 开发准备工作
  14. 在图形用户登录界面输入正确用户名与密码后,闪了一下(即将要登录进去那一刹那),它NND给我蹦出来了!
  15. 鏈接腳本、靜態庫、共享庫
  16. 医学影像研究的重要性 计算机,计算机辅助医学影像诊查之关键学习技术研究.doc...
  17. 这是我见过最好的JVM笔记,拿到阿里offer后我哭了
  18. CCS11用户界面介绍2
  19. java 调用博思得条码打印机
  20. 批量采集多个淘宝商品的洋淘买家秀图片并统一保存

热门文章

  1. a.x=a={n:1} JS中使用连等赋值操作
  2. 求矩阵的连通分支数问题
  3. 自动接单小票打印机是怎么实现的?
  4. 【Brain】登上国际顶刊 PNAS!科学家从理论计算机出发,提出了一个意识模型——「有意识的图灵机」...
  5. python拆分excel行_Python将一个Excel拆分为多个Excel
  6. 怎么把一个excel拆分成多个
  7. 跟着Code走,详解Symbian OS API调用过程
  8. H3C交换机结合深信服AC做802.1x认证
  9. ceres之cholesky求解器
  10. C2039 “OpenNI2Grabber”: 不是“pcl”的成员