aiohttp
什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。
安装
1 |
|
aiohttp 和 requests
requests 版爬虫
requests 同步方式连续 30 次简单爬取 http://httpbin.org
网站
1 |
|
示例结果
1 |
|
从爬取结果可以看出,同步爬取30次网站将花费43秒左右的时间,耗时非常长。
aiohttp 版爬虫
使用 aiohttp 和 asyncio 异步方式简单爬取30次网站
1 |
|
示例结果
1 |
|
从爬取时间可以看出,aiohttp 异步爬取网站只用了0.5秒左右的时间,比 requests 同步方式快了80倍左右,速度非常之快。
同一个 session
aiohttp.ClientSession() 中封装了一个 session 的连接池,并且在默认情况下支持 keepalives,官方建议在程序中使用单个 ClientSession 对象,而不是像上面示例中的那样每次连接都创建一个 ClientSession 对象,除非在程序中遇到大量的不同的服务。
将上面的示例修改为:
1 |
|
示例结果
1 |
|
从上面爬取的时间可以看出单个 ClientSession 对象比多个 ClientSession 对象多花了3倍时间。ClientSession 对象一直是同一个 0x1094aff98。
返回值
Json 串
在上面的示例中使用 response.text() 函数返回爬取到的内容,aiohttp 在处理 Json 返回值的时候,可以直接将字符串转换为 Json。
1 |
|
示例结果
1 |
|
当返回的 Json 串不是一个标准的 Json 时,resp.json() 函数可以传递一个函数对json进行预处理,如:resp.json(replace(a, b)),replace()函数表示 a 替换为 b。
字节流
aiohttp 使用 response.read() 函数处理字节流,使用 with open() 方式保存文件或者图片
1 |
|
response.read() 函数可以传递数字参数用于读取多少个字节,如:response.read(3)读取前3个字节。
参数
aiohttp 可以使用3种方式在 URL 地址中传递参数
1 |
|
示例URL地址
1 |
|
1 |
|
示例URL地址
1 |
|
1 |
|
示例URL地址
1 |
|
请求头
aiohttp 在自定义请求头时,类似于向 URL 传递参数的方式
1 |
|
COOKIES
cookies 是整个会话共用的,所以应该在初始化 ClientSession 对象时传递
1 |
|
POST 方式
在前面的示例中都是以 GET 方式提交请求,下面用 POST 方式请求
1 |
|
示例结果
1 |
|
在示例结果中可以看到 form 中的内容就是模拟 POST 方式提交的内容
超时
在请求网站时,有时会遇到超时问题,aiohttp 中使用 timeout 参数设置,单位为秒数,aiohttp 默认超时时间为5分钟
1 |
|
总结
aiohttp 以异步的方式爬取网站耗时远小于 requests 同步方式,这里列举了一些 aiohttp 常用功能,希望对大家有所帮助。
代码地址
示例代码:Python-100-day