神器啊!比requests还好用的Python高效爬虫框架!

Python 网络爬虫进阶教学全指南 本次博客将深入探究 Python 网络爬虫的核心知识与实用技巧,引领大家从入门迈向精通 阅读详情

原文地址:https://juejin.cn/post/7099280151648665613

最近公司  Python 后端项目进行重构,整个后端逻辑基本都变更为采用"异步"协程的方式实现。看着满屏幕经过 async await(协程在 Python 中的实现)修饰的代码,我顿时感到一脸懵逼,不知所措。

虽然之前有了解过"协程"是什么东西,但并没有深入探索,于是正好借着这次机会可以好好学习一下。

Let's go

18d6214a76f0ab3046291556a7b96354.jpeg

什么是协程?

简单来说,协程是一种基于线程之上,但又比线程更加轻量级的存在。对于系统内核来说,协程具有不可见的特性,所以这种由 程序员自己写程序来管理 的轻量级线程又常被称作 "用户空间线程"。

协程比多线程好在哪呢?

1. 线程的控制权在操作系统手中,而协程的控制权完全掌握在用户自己手中,因此利用协程可以减少程序运行时的上下文切换,有效提高程序运行效率。

2. 建立线程时,系统默认分配给线程的栈大小是 1 M,而协程更轻量,接近 1 K ,因此可以在相同的内存中开启更多的协程。

3. 由于协程的本质不是多线程而是单线程,所以不需要多线程的锁机制。因为只有一个线程,也不存在同时写变量而引起的冲突。在协程中控制共享资源不需要加锁,只需要判断状态即可。所以协程的执行效率比多线程高很多,同时也有效避免了多线程中的竞争关系。

协程的适用 & 不适用场景

适用场景:协程适用于被阻塞的,且需要大量并发的场景。

不适用场景:协程不适用于存在大量计算的场景(因为协程的本质是单线程来回切换),如果遇到这种情况,还是应该使用其他手段去解决。

初探异步 http 框架 httpx

至此我们对 "协程" 应该有了个大概的了解,但故事说到这里,相信有朋友还是满脸疑问:"协程" 对于接口测试有什么帮助呢?不要着急,答案就在下面。

相信用过 Python 做接口测试的朋友都对 requests 库不陌生。requests 中实现的 http 请求是同步请求,但其实基于 http 请求 IO 阻塞的特性,非常适合用协程来实现 "异步" http 请求从而提升测试效率。 

相信早就有人注意到了这点,于是在 Github 经过了一番探索后,果不其然,最终寻找到了支持协程 "异步" 调用 http 的开源库: httpx

什么是 httpx

httpx 是一个几乎继承了所有 requests 的特性并且支持 "异步" http 请求的开源库。简单来说,可以认为 httpx 是强化版 requests。

下面大家可以跟着我一起见识一下 httpx 的强大

安装

httpx 的安装非常简单,在 Python 3.6 以上的环境执行

pip install httpx

最佳实践

俗话说得好,效率决定成败。我分别使用了 httpx 异步 和 同步 的方式对批量 http 请求进行了耗时比较,来一起看看结果吧~

首先来看看同步 http 请求的耗时表现:

import asyncio
import httpx
import threading
import time


def sync_main(url, sign):
    response = httpx.get(url).status_code
    print(f'sync_main: {threading.current_thread()}: {sign}2 + 1{response}')


sync_start = time.time()
[sync_main(url='http://www.baidu.com', sign=i) for i in range(200)]
sync_end = time.time()
print(sync_end - sync_start)

代码比较简单,可以看到在 sync_main 中则实现了同步 http 访问百度 200 次。

运行后输出如下(截取了部分关键输出...):

sync_main: <_MainThread(MainThread, started 4471512512)>: 192: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 193: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 194: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 195: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 196: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 197: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 198: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 199: 200
16.56578803062439

可以看到在上面的输出中, 主线程没有进行切换(因为本来就是单线程啊喂!)请求按照顺序执行(因为是同步请求)。

程序运行共耗时 16.6 秒

下面我们试试 "异步" http 请求:

import asyncio
import httpx
import threading
import time


client = httpx.AsyncClient()


async def async_main(url, sign):
    response = await client.get(url)
    status_code = response.status_code
    print(f'async_main: {threading.current_thread()}: {sign}:{status_code}')


loop = asyncio.get_event_loop()
tasks = [async_main(url='http://www.baidu.com', sign=i) for i in range(200)]
async_start = time.time()
loop.run_until_complete(asyncio.wait(tasks))
async_end = time.time()
loop.close()
print(async_end - async_start)

上述代码在 async_main 中用 async await 关键字实现了"异步" http,通过 asyncio ( 异步 io 库请求百度首页 200 次并打印出了耗时)。

运行代码后可以看到如下输出(截取了部分关键输出...)

async_main: <_MainThread(MainThread, started 4471512512)>: 56: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 99: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 67: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 93: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 125: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 193: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 100: 200
4.518340110778809

可以看到顺序虽然是乱的(56,99,67...) (这是因为程序在协程间不停切换) 但是主线程并没有切换 (协程本质还是单线程 )。

程序共耗时 4.5 秒

比起同步请求耗时的 16.6 秒 缩短了接近 73 %!

俗话说得好,一步快,步步快。 在耗时方面,"异步" httpx 确实比同步 http 快了很多。当然,"协程" 不仅仅能在请求效率方面赋能接口测试, 掌握 "协程"后,相信小伙伴们的技术水平也能提升一个台阶,从而设计出更优秀的测试框架。

好了,这就是今天分享的全部内容,喜欢就点个赞吧~


 

 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看B站我的20个视频!

Python爬虫基础教程(3)Python网络爬虫技术核心之网络爬虫实现原理:别愣着了!Python爬虫根本不是“偷”数据,而是让网页自己开口说话! 你以为爬虫是黑客在键盘上噼里啪啦就能盗取数据?错啦!它其实是个“超级模仿秀”。本文将用最接地气的方式,深扒Python网络爬虫的核心原理:浏览器如何“撩”服务器,爬虫就如何“复刻”这份心动。我们会把“请求-响应”的暧昧关系、HTML的“内心OS”解析、以及应对反爬的“社交礼仪”掰开揉碎讲给你听。最后,附上一个从入门到“差点放弃”的完整示例,让你笑着看懂,这门让数据自动送上门的技术到底有多酷! 阅读详情

相关推荐

川川本人著作《Python网络爬虫入门到实战》

🔥 《Python网络爬虫入门到实战》 🔥 书籍介绍

全栈川川 4108

python写爬虫代码,除了requests和beautifulsoup4还需要哪些库?【学习记录】

Python写爬虫代码时,除了requests和beautifulsoup4,还有一些其他的库可以使用。

油腻青年 599

从入门到精通,搞定数据采集!《Python3网络爬虫数据采集》必入指南

《Python3网络爬虫数据采集》是一本实战导向的爬虫技术指南,通过基础、实战和框架三大模块,系统讲解数据采集全流程。书中涵盖网站分析、数据抓取与清洗等核心技能,并提供12306抢票、微博爬取等真实案例,帮助读者快速掌握Python爬虫技术。特别适合零基础学习者和开发者提升技能,培养从数据采集到存储部署的全链路能力,有效增强职场竞争力。

2401_87690752的博客 1674

比requests更强大的Python 库,让你的爬虫效率提高一倍

什么是 httpxhttpx 是一个几乎继承了所有 requests 的特性并且支持 “异步” http 请求的开源库。简单来说,可以认为 httpx 是强化版 requests。下面大家可以跟着我一起见识一下 httpx 的强大安装httpx 的安装非常简单,在 Python 3.6 以上的环境执行最佳实践俗话说得好,效率决定成败。

2201_75863152的博客 668

httpx是一种快速且多功能的HTTP工具包,允许使用retryablehttp库运行多个探测器-Golang开发

httpx是一种快速且多功能的HTTP工具包,允许使用retryablehttp库运行多个探测器,它旨在通过增加线程数来保持结果的可靠性。 httpx是一种快速且多功能的HTTP工具包,允许使用retryablehttp库运行多个探测器,它旨在通过增加线程数来保持结果的可靠性。 资源资源功能用法安装说明从二进制文件从源文件运行httpX到探针7614主机使用stdin运行httpx并使用文件输入运行httpx并使用CIDR输入运行httpx并使用带有subfinder / chaos和任何其他类似工具的httpx。 运行带有json输出的httpX Todo谢谢

幸狐RV1106开发板实战:5分钟搞定Yolo8模型部署(附避坑指南)

本文详细介绍了在幸狐RV1106开发板上快速部署YOLOv8模型的实战流程。通过RKNN-Toolkit2工具链,将ONNX模型转换为RV1106 NPU专用的RKNN格式,并完成交叉编译与上板运行。文章重点分享了环境搭建、模型转换的关键步骤以及常见的避坑指南,帮助开发者高效实现边缘AI目标检测应用。

weixin_28677451的博客 916

Python有一个比requests库更好用的httpx库

使用httpx库发送 HTTP 请求非常简单。首先,需要安装httpx然后,在 Python 代码中导入httpx库,就可以使用它发送 HTTP 请求了。例如,下面是一个使用httpx库发送GETresponse = httpx . get("https://www.example.com") print(response . status_code) # 输出响应状态码 print(response . text) # 输出响应文本下面是一个使用httpx库发送POSTdata = {

Class的博客 3153

OpenClaw + Qwen 模型集成飞书完整教程

1、环境要求:- **操作系统**: Windows- **Node.js**: v18+ (推荐 v20+)- **飞书账号**: 需要企业管理员权限(创建应用用)或者个人飞书账号创建个人应用- **网络**: 能访问 GitHub 和飞书开放平台2、安装Node.js下载完成后验证是否安装成功,cmd窗口输入“node --version”,显示版本号即为安装成功(如下图所示)3、获取大模型APIKEY(这里以Qwen为例)

qq_29609427的博客 478

比requests还好用的Python高效爬虫库,效率提升一倍!

在聊httpx之前,我们先简单谈谈协程。协程与多线程相似,但又有显著区别。它可以看作是一种更轻量级的“线程”,完全由程序员在用户空间管理。这意味着,它避免了操作系统对线程调度的开销,从而提升了性能。具体优势有以下几点:用户控制:协程的切换完全由程序员控制,而不是依赖操作系统,减少了上下文切换的开销。内存占用低:线程需要分配较大的栈空间(通常MB级别),而协程仅需几KB的内存。这意味着在同等内存中可以运行更多的协程。不需要锁机制:协程是单线程的,避免了多线程竞争资源的问题,因此不需要复杂的锁机制。

Candyz7的博客 1298

Python遥感图像处理指南(2)-卫星影像分析MNDWI提取

在第一篇文章中,我们使用了我们导入的软件包中已定义的函数,如 rasterio 中的 open 和 read 以及 matplotlib 中的 imshow。现在,我们可以编写自己的函数了。函数是一段代码,它接收一些参数作为输入并返回输出(经过一些计算),可以在代码中多次重复使用,也可以被其他代码重用。在 Python 中定义一个新函数非常简单。return v在此语法示例中,arg1和arg2强制参数,应该传递给函数,否则会引发错误,而arg3是一个可选参数,如果是,则假定默认值 1从函数调用中省略。

gis收藏家的博客 1576

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 421

requests库的替代品

每个库都有其自身的优势和特点,选择哪一个取决于你的具体需求,例如,是否需要异步支持、API的简单性、或对HTTP/2的支持等。

m0_57236802的博客 1152

【YOLOv8科研级创新】集成HS-FPN特征融合网络,让Neck模块在参数量锐减100W的同时精度跃升

打开确保模型解析器能识别HS_FPN模块。通过将HS-FPN集成到YOLOv8中,我们实现了一个“轻量级多尺度特征融合+精准检测”的目标检测模型。这个改进不仅在工程上能提升多尺度、细粒度场景的检测效果并降低部署成本,更在科研上提供了“选择性轻量级特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的Neck模块改进中,帮你在论文中打造独特的研究点。

m0_64661770的博客 138

神器啊!比requests还好用的Python高效爬虫框架

最近公司 Python 后端项目进行重构,整个后端逻辑基本都变更为采用"异步"协程的方式实现。看着满屏幕经过 async await(协程在 Python 中的实现)修饰的代码,我顿时感到一脸懵逼,不知所措。虽然之前有了解过"协程"是什么东西,但并没有深入探索,于是正好借着这次机会可以好好学习一下。Let's go什么是协程?简单来说,协程是一种基于线程之上,但又比线程更加轻量级的存在。对于系统内核来说,协程具有不可见的特性,所以这种由 程序员自己写程序来管理 的轻量级线程又常被称作 "用户空间线程"。协

m0_72091242的博客 308

使用ArcGIS Pro进行土地利用分类的机器学习与深度学习

传统的土地利用分类方法通常依赖于手动解译和规则定义,但随着机器学习和深度学习的发展,我们现在可以利用这些技术来自动化和提高分类的精度。ArcGIS Pro是一种功能强大的GIS软件,它提供了丰富的工具和功能,可以支持土地利用分类的机器学习和深度学习。我们将首先讨论数据准备和预处理的步骤,然后介绍常用的机器学习和深度学习方法,并提供相应的源代码示例。这可以通过人工标注或半自动的方式完成。数据裁剪:根据研究区域的范围,裁剪遥感影像数据,以减少计算和存储的负担,并确保只包含感兴趣的土地利用区域。

code_program481的博客 2043

风光互补制氢系统动态仿真建模与性能分析

摘要 本文针对离网型风光互补制氢系统,建立了包含光伏阵列、风力发电机、PEM电解槽、储能电池和储氢罐的完整动态数学模型。基于MATLAB/Simulink平台开发了模块化仿真框架,设计了考虑电解槽最小运行功率约束的能量管理策略。通过典型日仿真分析表明,风光互补可有效平抑单一能源的功率波动,系统整体能量效率达58.7%,电解槽负荷跟随特性良好。提出的动态仿真方法为风光制氢系统的优化设计和运行控制提供了有效工具。 关键词:风光互补制氢;PEM电解槽;动态仿真;MATLAB/Simulink;能量管理

huanghm88的专栏 77

【神器啊】比requests还好用的Python高效爬虫框架

Let's go简单来说,协程是一种基于线程之上,但又比线程更加轻量级的存在。对于系统内核来说,协程具有不可见的特性,所以这种由 程序员自己写程序来管理 的轻量级线程又常被称作 "用户空间线程"。...

m0_59485658的博客 279

基于YOLOv8的城市违建识别系统:从数据集构建到UI界面实现

YOLOv8是Ultralytics公司于2023年推出的最新一代YOLO(You Only Look Once)系列目标检测算法。更高效的骨干网络设计改进的锚框机制更精确的损失函数支持分类、检测、分割等多任务YOLOv8特别适合像违建识别这样的实时检测任务,能够在保持高精度的同时实现快速推理。

YOLO 675

Python中高效的爬虫框架,你用过几个?

Scrapy是一个功能强大的Python网络爬虫框架,专为数据采集而设计。它提供了一套高度可定制的工具和流程,使得你可以轻松地构建和管理网络爬虫,从而快速地获取所需的数据。Requests-HTML是一个基于Requests库的Python库,专门用于方便的HTML解析。它提供了一种简洁而强大的方式来请求网页、解析HTML内容以及提取所需的数据。Selenium是一个用于自动化浏览器操作的强大工具,被广泛用于网络爬虫、自动化测试、网页交互等场景。

2301_82275412的博客 757

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python爬虫基础—requests库

之前尝试接触爬虫,比较零散也比较陌生,最近整理并再学习下。从爬虫必备库requests开始,requests库可以说是中小规模爬虫的神器,简单来说requests库主要是用来向服务器提交某些所指定url申请 并获取网页界面内容(网页内容的源代码)。如若想详细了解,可以看requests库的官方文档。 requests库的安装(基于Windows操作系统,保证网络畅通) ...

xiaoyeren_ITRoad的博客 422

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Python入门:Python3 requests模块全面学习教程

Python入门:Python requests模块全面学习教程,本文是围绕该模块的使用展开,其作为第三方 HTTP 请求库,因 API 简洁、功能完善,比标准库 urllib 更易用,是爬虫、接口测试等场景的首选工具。教程先介绍基础准备,包括通过 pip 安装模块及 import 导入;再详解核心操作,如发送 GET 请求获取网页或 JSON 数据(可带查询参数、请求头)、用 POST 提交表单或 JSON 数据,同时说明 response 对象的关键属性……

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

python网络爬虫资源库名_Python网络爬虫

网友NO.524767Python网络爬虫与信息提取(实例讲解)课程体系结构: 1、Requests框架:自动爬取HTML页面与自动网络请求提交 2、robots.txt:网络爬虫排除标准 3、BeautifulSoup框架:解析HTML页面 4、Re框架:正则框架,提取页面关键信息 5、Scrapy框架:网络爬虫原理介绍,专业爬虫框架介绍 理念:The Website is the API .....

weixin_39755853的博客 245

【通用技术】2个月精通Python爬虫——3大爬虫框架+6场实战+分布式爬虫,包教包会

网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动的抓取信息的程序或者脚本。 网络爬虫是互联网上进行信息采集的通用手段,在互联网的各个专业方向上都是不可或缺的底层技术支撑。本课程从爬虫基础开始,全面介绍了Python网络爬虫技术,并且包含各种经典的网络爬虫项目案例。 分类: 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpos...

lsj960922的博客 342

用快马 AI 一键生成 Python requests 爬虫,告别手动编码时代!

使用InsCode(快马)平台的这段时间,最明显的感受就是"快"。从需求描述到获得可运行代码,再到最终部署上线,传统需要几天的工作现在几个小时就能完成。特别是它的 AI 对话功能,遇到问题随时提问就能得到针对性建议,大大降低了学习成本。对于需要快速验证想法或者不擅长编码的运营、产品同学,这个平台简直是神器。即便是经验丰富的开发者,也能从中获得效率提升,把时间花在更重要的业务逻辑上。

SilverMoon18的博客 1313

零基础学Python网络爬虫案例实战全流程详解(入门与提高篇)

笔者编写的《Python金融大数据挖掘与分析全流程详解》于2019年出版面市后,陆续有不少读者表示对该书的爬虫部分非常感兴趣,想做进一步的学习。笔者由此萌生了一个想法:专门针对Python爬虫技术编写一套书籍,在保留之前核心内容的基础上,新增更多实战案例,方便读者在练中学,并体会Python爬虫在实战中的应用。

mirana的专栏 3014
上一篇: 神器啊!轻松用 Python 写个 APP!
下一篇: Python做一个Kindle电子书下载助手,真香!
菜鸟学Python
博客等级 码龄9年 8089粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值