爬虫aiohttp请求库讲解之高效率下载

c2fdfc039245d688520fab6ab02f7516d01b24e7

aiohttp是asyncio和Python的异步HTTP客户端/服务器。

爬虫常用的是HTTP客户端,跟requests库一样为网络请求库。

requests库是同步的,不能结合asyncio使用,aiohttp常和asyncio库结合使用。

基本使用如下:

503d269759ee3d6d0e2609f555fb652a4e4ade25

1、ClientSession()

我们每次发送请求时,会首先创建一个客户端(类似于浏览器),利用客户端来发送请求。

我们可以以下方式创建:

async with aiohttp.ClientSession() as session:

这种方式创建就不用手动关闭。另一种是手动关闭的形式:

session = aiohttp.ClientSession()

await session.close()

这种方式较为常用。因为我们一般会把session作为全局变量使用,这样就不必每个网络请求函数都传入这个session参数。后续代码会见到。

2、请求方式

请求方式的用法和requests库差不多。

get请求:

session.get(url)

post请求:

session.post(url, data=xxx)

以下讲解ClientSession()中常常定义的参数

3、headers参数

为每个请求方式添加请求头,这样我们就不必在get或post请求中再加入请求头了

64380cd7912397dda18de2fb4d6fbabfd2a28749

4、timeout超时设置

防止程序在某个网络请求上一直阻塞,需要定义这个请求参数。默认设置是5分钟

我们需要先定义一个aiohttp.ClientTimeout(total)对象,之后传给timeout参数。

timeout = aiohttp.ClientTimeout(3)

session = aiohttp.ClientSession(timeout=timeout, headers=headers)

如果超时会报错,这时我们在相应位置进行捕获处理。

5、ssl证书设置

如果爬取没有ssl证书的网站就会报ssl证书的错误。我们需要以下设置:

session = aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False))

6、获取响应

我们利用response = session.get(url)得到响应后,通过以下方式获取具体内容:

# 获取响应状态码

status = response.status

# 获取html代码

html = await response.text()

# 获取二进制内容

bytes = await response.read()

# 获取json格式的响应内容, 返回的是字典

json = await response.json()

注意:

response.text()通常会猜测出charset编码,如果不准确需要自己指定。在 text(encoding=’编码’)即可。

7、控制异步爬取的并发量

通常协程的数量是可以无限多的,但考虑到网站并发量的承受程度,如果并发量过大,可能导致网站挂掉。

我们可以通过控制并发量来解决这个问题,利用asyncio.Semaphore(CONCURRENCY)即可,括号里面的参数即自定义的并发量。

之后将此代码嵌套在get或post请求的外面:

b03533fa828ba61e32ff072454d99f02314e5999

8、异步爬取美女壁纸案例

aa64034f78f0f7368cfbce331fb8bb11eac413eb
a9d3fd1f4134970a22e3ad228627d9c0a6865d1b
c2fdfc039245d68858bca3dcb22f7516d31b2404
cb8065380cd79123305b07d9b8d9518ab0b780dd