aiohttp的异步爬虫使用方法

2024-01-21 03:48

本文主要是介绍aiohttp的异步爬虫使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

aiohttp是python3的一个异步模块,分为服务器端和客户端。廖雪峰的python3教程中,讲的是服务器端的使用方法。均益这里主要讲的是客户端的方法,用来写爬虫。使用异步协程的方式写爬虫,能提高程序的运行效率。

1、安装

Python
pip install <span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/aiohttp" title="View all posts in aiohttp" target="_blank">aiohttp</a></span>
1
2
pip install aiohttp

2、单一请求方法

Python
import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(url): async with aiohttp.ClientSession() as session: html = await fetch(session, url) print(html) url = 'http://junyiseo.com' loop = asyncio.get_event_loop() loop.run_until_complete(main(url))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import aiohttp
import asyncio
async def fetch ( session , url ) :
async with session . get ( url ) as response :
return await response . text ( )
async def main ( url ) :
async with aiohttp . ClientSession ( ) as session :
html = await fetch ( session , url )
print ( html )
url = 'http://junyiseo.com'
loop = asyncio . get_event_loop ( )
loop . run_until_complete ( main ( url ) )

3、多url请求方法

Python
import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(url): async with aiohttp.ClientSession() as session: html = await fetch(session, url) print(html) loop = asyncio.get_event_loop() # 生成多个请求方法 url = "http://junyiseo.com" tasks = [main(url), main(url)] loop.run_until_complete(asyncio.wait(tasks)) loop.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import aiohttp
import asyncio
async def fetch ( session , url ) :
async with session . get ( url ) as response :
return await response . text ( )
async def main ( url ) :
async with aiohttp . ClientSession ( ) as session :
html = await fetch ( session , url )
print ( html )
loop = asyncio . get_event_loop ( )
# 生成多个请求方法
url = "http://junyiseo.com"
tasks = [ main ( url ) , main ( url ) ]
loop . run_until_complete ( asyncio . wait ( tasks ) )
loop . close ( )

4、其他的请求方式

上面的代码中,我们创建了一个 ClientSession 对象命名为session,然后通过session的get方法得到一个 ClientResponse 对象,命名为resp,get方法中传入了一个必须的参数url,就是要获得源码的http url。至此便通过协程完成了一个异步IO的get请求。
aiohttp也支持其他的请求方式

Python
session.post('http://httpbin.org/post', data=b'data') session.put('http://httpbin.org/put', data=b'data') session.delete('http://httpbin.org/delete') session.head('http://httpbin.org/get') session.options('http://httpbin.org/get') session.patch('http://httpbin.org/patch', data=b'data')
1
2
3
4
5
6
7
8
session . post ( 'http://httpbin.org/post' , data = b 'data' )
session . put ( 'http://httpbin.org/put' , data = b 'data' )
session . delete ( 'http://httpbin.org/delete' )
session . head ( 'http://httpbin.org/get' )
session . options ( 'http://httpbin.org/get' )
session . patch ( 'http://httpbin.org/patch' , data = b 'data' )

5、请求方法中携带参数

GET方法带参数

Python
params = {'key1': 'value1', 'key2': 'value2'} async with session.get('http://httpbin.org/get', params=params) as resp: expect = 'http://httpbin.org/get?key2=value2&key1=value1' assert str(resp.url) == expect
1
2
3
4
5
6
params = { 'key1' : 'value1' , 'key2' : 'value2' }
async with session . get ( 'http://httpbin.org/get' ,
params = params ) as resp :
expect = 'http://httpbin.org/get?key2=value2&key1=value1'
assert str ( resp . url ) == expect

POST方法带参数

Python
payload = {'key1': 'value1', 'key2': 'value2'} async with session.post('http://httpbin.org/post', data=payload) as resp: print(await resp.text())
1
2
3
4
5
payload = { 'key1' : 'value1' , 'key2' : 'value2' }
async with session . post ( 'http://httpbin.org/post' ,
data = payload ) as resp :
print ( await resp . text ( ) )

6、获取响应内容

resp.status 是http状态码,
resp.text() 是网页内容

Python
async with session.get('https://api.github.com/events') as resp: print(resp.status) print(await resp.text())
1
2
3
4
async with session . get ( 'https://api.github.com/events' ) as resp :
print ( resp . status )
print ( await resp . text ( ) )

gzip和deflate转换编码已经为你自动解码。

7、JSON请求处理

Python
async with aiohttp.ClientSession() as session: async with session.post(url, json={'test': 'object'})
1
2
3
async with aiohttp . ClientSession ( ) as session :
async with session . post ( url , json = { 'test' : 'object' } )

返回json数据的处理

Python
async with session.get('https://api.github.com/events') as resp: print(await resp.json())
1
2
3
async with session . get ( 'https://api.github.com/events' ) as resp :
print ( await resp . json ( ) )

8、以字节流的方式读取文件,可以用来下载

Python
async with session.get('https://api.github.com/events') as resp: await resp.content.read(10) #读取前10个字节
1
2
3
async with session . get ( 'https://api.github.com/events' ) as resp :
await resp . content . read ( 10 ) #读取前10个字节

下载保存文件

Python
with open(filename, 'wb') as fd: while True: chunk = await resp.content.read(chunk_size) if not chunk: break fd.write(chunk)
1
2
3
4
5
6
7
with open ( filename , 'wb' ) as fd :
while True :
chunk = await resp . content . read ( chunk_size )
if not chunk :
break
fd . write ( chunk )

9、上传文件

Python
url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} await session.post(url, data=files)
1
2
3
4
5
url = 'http://httpbin.org/post'
files = { 'file' : open ( 'report.xls' , 'rb' ) }
await session . post ( url , data = files )

可以设置好文件名和content-type:

Python
url = 'http://httpbin.org/post' data = FormData() data.add_field('file', open('report.xls', 'rb'), filename='report.xls', content_type='application/vnd.ms-excel') await session.post(url, data=data)
1
2
3
4
5
6
7
8
9
url = 'http://httpbin.org/post'
data = FormData ( )
data . add_field ( 'file' ,
open ( 'report.xls' , 'rb' ) ,
filename = 'report.xls' ,
content_type = 'application/vnd.ms-excel' )
await session . post ( url , data = data )

10、超时处理

默认的IO操作都有5分钟的响应时间 我们可以通过 timeout 进行重写,如果 timeout=None 或者 timeout=0 将不进行超时检查,也就是不限时长。

Python
async with session.get('https://github.com', timeout=60) as r: ...
1
2
3
async with session . get ( 'https://github.com' , timeout = 60 ) as r :
. . .

11、自定义请求头

Python
url = 'http://example.com/image' payload = b'GIF89a\x01\x00\x01\x00\x00\xff\x00,\x00\x00' b'\x00\x00\x01\x00\x01\x00\x00\x02\x00;' headers = {'content-type': 'image/gif'} await session.post(url, data=payload, headers=headers)
1
2
3
4
5
6
7
8
9
url = 'http://example.com/image'
payload = b 'GIF89a\x01\x00\x01\x00\x00\xff\x00,\x00\x00'
b '\x00\x00\x01\x00\x01\x00\x00\x02\x00;'
headers = { 'content-type' : 'image/gif' }
await session . post ( url ,
data = payload ,
headers = headers )

设置session的请求头

Python
headers={"Authorization": "Basic bG9naW46cGFzcw=="} async with aiohttp.ClientSession(headers=headers) as session: async with session.get("http://httpbin.org/headers") as r: json_body = await r.json() assert json_body['headers']['Authorization'] == \ 'Basic bG9naW46cGFzcw=='
1
2
3
4
5
6
7
headers = { "Authorization" : "Basic bG9naW46cGFzcw==" }
async with aiohttp . ClientSession ( headers = headers ) as session :
async with session . get ( "http://httpbin.org/headers" ) as r :
json_body = await r . json ( )
assert json_body [ 'headers' ] [ 'Authorization' ] == \
'Basic bG9naW46cGFzcw=='

12、自定义cookie

Python
url = 'http://httpbin.org/cookies' cookies = {'cookies_are': 'working'} async with ClientSession(cookies=cookies) as session: async with session.get(url) as resp: assert await resp.json() == { "cookies": {"cookies_are": "working"}}
1
2
3
4
5
6
7
url = 'http://httpbin.org/cookies'
cookies = { 'cookies_are' : 'working' }
async with ClientSession ( cookies = cookies ) as session :
async with session . get ( url ) as resp :
assert await resp . json ( ) == {
"cookies" : { "cookies_are" : "working" } }

在多个请求中共享cookie

Python
async with aiohttp.ClientSession() as session: await session.get( 'http://httpbin.org/cookies/set?my_cookie=my_value') filtered = session.cookie_jar.filter_cookies( 'http://httpbin.org') assert filtered['my_cookie'].value == 'my_value' async with session.get('http://httpbin.org/cookies') as r: json_body = await r.json() assert json_body['cookies']['my_cookie'] == 'my_value'
1
2
3
4
5
6
7
8
9
10
async with aiohttp . ClientSession ( ) as session :
await session . get (
'http://httpbin.org/cookies/set?my_cookie=my_value' )
filtered = session . cookie_jar . filter_cookies (
'http://httpbin.org' )
assert filtered [ 'my_cookie' ] . value == 'my_value'
async with session . get ( 'http://httpbin.org/cookies' ) as r :
json_body = await r . json ( )
assert json_body [ 'cookies' ] [ 'my_cookie' ] == 'my_value'

13、限制同时请求数量

limit默认是100,limit=0的时候是无限制

Python
conn = aiohttp.TCPConnector(limit=30)
1
2
conn = aiohttp . TCPConnector ( limit = 30 )

14、SSL加密请求

有的请求需要验证加密证书,可以设置ssl=False,取消验证

Python
r = await session.get('https://example.com', ssl=False)
1
2
r = await session . get ( 'https://example.com' , ssl = False )

加入证书

Python
sslcontext = ssl.create_default_context( cafile='/path/to/ca-bundle.crt') r = await session.get('https://example.com', ssl=sslcontext)
1
2
3
4
sslcontext = ssl . create_default_context (
cafile = '/path/to/ca-bundle.crt' )
r = await session . get ( 'https://example.com' , ssl = sslcontext )

15、代理请求

Python
async with aiohttp.ClientSession() as session: async with session.get("http://<span class="wp_keywordlink"><a href="http://www.168seo.cn/python" title="python">python</a></span>.org", proxy="http://proxy.com") as resp: print(resp.status)
1
2
3
4
5
async with aiohttp . ClientSession ( ) as session :
async with session . get ( "http://python.org" ,
proxy = "http://proxy.com" ) as resp :
print ( resp . status )

代理认证

Python
async with aiohttp.ClientSession() as session: proxy_auth = aiohttp.BasicAuth('user', 'pass') async with session.get("http://<span class="wp_keywordlink"><a href="http://www.168seo.cn/python" title="python">python</a></span>.org", proxy="http://proxy.com", proxy_auth=proxy_auth) as resp: print(resp.status)
1
2
3
4
5
6
7
async with aiohttp . ClientSession ( ) as session :
proxy_auth = aiohttp . BasicAuth ( 'user' , 'pass' )
async with session . get ( "http://python.org" ,
proxy = "http://proxy.com" ,
proxy_auth = proxy_auth ) as resp :
print ( resp . status )

或者通过URL认证

Python
session.get("http://python.org", proxy="http://user:pass@some.proxy.com")
1
2
3
session . get ( "http://python.org" ,
proxy = "http://user:pass@some.proxy.com" )

16、优雅的关闭程序

没有ssl的情况,加入这个语句关闭await asyncio.sleep(0)

Python
async def read_website(): async with aiohttp.ClientSession() as session: async with session.get('http://example.org/') as resp: await resp.read() loop = asyncio.get_event_loop() loop.run_until_complete(read_website()) # Zero-sleep to allow underlying connections to close loop.run_until_complete(asyncio.sleep(0)) loop.close()
1
2
3
4
5
6
7
8
9
10
11
async def read_website ( ) :
async with aiohttp . ClientSession ( ) as session :
async with session . get ( 'http://example.org/' ) as resp :
await resp . read ( )
loop = asyncio . get_event_loop ( )
loop . run_until_complete ( read_website ( ) )
# Zero-sleep to allow underlying connections to close
loop . run_until_complete ( asyncio . sleep ( 0 ) )
loop . close ( )

如果是ssl请求,在关闭前需要等待一会

Python
loop.run_until_complete(asyncio.sleep(0.250)) loop.close()
1
2
3
loop . run_until_complete ( asyncio . sleep ( 0.250 ) )
loop . close ( )

*** 转自均益博客




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱

这篇关于aiohttp的异步爬虫使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628284

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图