异步爬虫:aiohttp 异步请求库使用:

2024-06-19 00:36

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

使用requests 请求库虽然可以完成爬虫业务,但是对于异步任务来说,它是做不到的, 这时候我们需要借助 aiohttp 异步请求库来完成异步爬虫的编写:

话不多说,直接看示例:

注意:楼主使用的python版本是最新的,3.12的py版本, 另外pycharm使用的也是最新版的 2024版本的。 请务必与我保持一致, 否则会报很多莫名其妙的异常信息。

下载:

使用aiohttp 异步请求库请先pip 下载:

pip install aiohttp

基本实例:

import asyncio
import aiohttpasync def get(session, url):async with session.get(url) as response:return await response.text(), response.statusasync def test():url = "http://www.baidu.com"async with aiohttp.ClientSession() as session:html_text, status = await get(session, url)print(html_text)print(status)if __name__ == '__main__':asyncio.run(test())

以上代码示例首先我们需要导入两个库,分别是aiohttp,  asyncio,  因为要实现异步任务,而启动异步需要使用asyncio, 关于异步的知识点请自行查阅补充。

其次使用 async 关键字定义了一个 get 异步函数, 它接受了 session, url 两个参数, 而session则为aiohttp 中客户端ClientSession() 对象, 因为aiohttp 它提供了两套业务功能, 分别是服务端和客服端, 服务端主要就是实现处理客户端发送请求的异步业务, 而客户端,就是发送请求的,我们学爬虫,就需要学aiohttp 提供的客户端操作功能。 言归正传, 在这个get 方法中, 使用 async 关键字来声明一个异步上下文管理器<with ... as ...>, 然后返回所得到的响应,

而在test 异步函数中, 创建了一个ClientSession 对象, 然后调用get 函数,将session对象和url传递进去, 最后调用asyncio.run 启动协程任务。

请求:

GET:

对于一些有关于Get 请求携带参数的情况,我们可以使用 params 形参来完成

async def test():params = {"name": "I love Python", "code": 520}url = "https://www.httpbin.org/get"async with aiohttp.ClientSession() as session:# 使用params 形参传递get 请求数据async with session.get(url=url, params=params) as response:print(await response.text())if __name__ == '__main__':asyncio.run(test())

aiohttp 也提供了 POST, PUT, DELETE, HEAD, PATCH, OPTIONS 等请求方式。

POST:

而对于post 请求表单提交的数据, 例如Content-Type 为: application/X-www-form-urlencoded 的数据, 我们可以使用 data 形参来完成, 楼主看了一下源码,如果post 传递的数据为 json, 楼主斗胆猜一下,应该为json 形参,我们可以看一下源码:

由此可见,它的使用方式几乎和 requests 同步请求库一模一样

async def test():data = {"name": "I love Python", "code": 520}url = "https://www.httpbin.org/post"async with aiohttp.ClientSession() as session:# 使用 data 形参 传递 表单提交的数据async with session.post(url=url, data=data) as response:print(await response.text())if __name__ == '__main__':asyncio.run(test())

响应:

 对于响应结果,我们可以调用一下方法来获取其中的:状态码,响应头,响应体,响应体二进制内容,响应体JSON数据。

async def test():data = {"name": "I love Python", "code": 520}url = "https://www.httpbin.org/post"async with aiohttp.ClientSession() as session:async with session.post(url, data=data) as response:print(response.status) # 响应状态码print(response.headers) # 响应头print(await response.text()) # 获取响应体print(await response.read()) # 获取二进制数据print(await response.json()) # 获取相响应的JSON数据if __name__ == '__main__':asyncio.run(test())

超时设置:

我们可以借助aiohttp 提供的 ClientTimeout 对象来实现超时, 如果超时还未请求到数据,则抛异常

async def test():data = {"name": "I love Python", "code": 520}url = "https://www.httpbin.org/post"timeout = aiohttp.ClientTimeout(total=1) # 设置超时时间,单位为 秒async with aiohttp.ClientSession(timeout=timeout) as session:async with session.post(url, data=data) as response:passif __name__ == '__main__':asyncio.run(test())

ClientTimeout 对象同样还提供了其它参数, 例如:connect, socket_connect 等等, 详细参考官方文档:

https://docs.aiohttp.org.en.stable/client_quickstart.html#timeouts

并发限制:

由于异步爬虫拥有非常非常高的并发量, 如几万,几十万,甚至上百万都有可能, 但是如此高的并发量,目标服务器很可能无法再短时间内响应,而且有瞬间将目标服务器爬挂掉的危险, 所以,我们需要控制一下爬取的并发量。

我们可以借助asyncio 的 Semaphore 来控制并发量:


# 最高并发 5 个
CONCURRENCY = 5url = "http://www.baidu.com"# 创建信号量对象 并将最大并发量常量传递进来
semaphores = asyncio.Semaphore(CONCURRENCY)session = Noneasync def test():# 使用信号量对象创建异步上下文即可控制最高并发量async with semaphores:print("爬取ing: ", url)async with session.get(url) as response:await asyncio.sleep(1)return await response.text()async def main():global sessionsession = aiohttp.ClientSession()test_tasks = [test() for i in range(1000)]await asyncio.gather(*test_tasks)if __name__ == '__main__':asyncio.run(main())

完了.... aiohttp 官方网站: https://docs.aiohttp.org/

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



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

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1