当前位置:

首页 > 编程开发 > 神器啊!比requests还好用的Python高效爬虫框架!

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

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

本文目录

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

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

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

    Let's go

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

    什么是协程?

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

    协程比多线程好在哪呢?

    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 快了很多。当然,"协程" 不仅仅能在请求效率方面赋能接口测试, 掌握 "协程"后,相信小伙伴们的技术水平也能提升一个台阶,从而设计出更优秀的测试框架。

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    Python爬取网页的详细步骤与代码实例教程
    Python爬取网页的详细步骤与代码实例教程

    一份结构清晰、注重实操的Python爬取网页详细教程,涵盖环境搭建、HTTP请求发送、HTML解析、数据持久化存储与异常处理等完整步骤与代码实例。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。