异步爬虫: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构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND