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

news2024/11/15 12:13:15

Python开发者们最常用的库之一就是requests,它以简单易用的API和强大的功能深受喜爱。然而,随着爬取任务的复杂性增加,requests的局限性逐渐显现。一些更为高效、功能更强大的爬虫库开始进入开发者的视野

那么,有没有比requests更高效、更适合复杂爬虫任务的Python库?这些库又是如何帮助开发者更快速、更智能地进行网页数据采集的?

在众多Python爬虫库中,httpxaiohttp无疑是两个突出的代表。httpx不仅保留了requests的简洁性,还提供了异步支持,让爬虫任务的并发处理能力大幅提升。而aiohttp则凭借其对异步I/O的出色支持,成为处理大规模爬取任务时的理想选择。比如在一个涉及百万级页面的爬取项目中,使用aiohttp的开发团队将原本需要数天的任务缩短到了数小时,大大提高了效率。

嗨,大家周二好呀,今天看到九月的中秋节和国庆节需要调休时,无语至极...
废话少说,今天来聊聊一个比requests还好用的Python高效爬虫库,httpx。

最近公司在搞Python后端项目重构,整个后端逻辑都变成了“异步”协程的方式实现。看着满屏的async和await,测试内心那叫一个崩溃。之前对协程有点了解,但这次是真正上手了,今天就把学习成果分享给大家。

什么是协程?

协程是一种比线程更轻量级的存在。简单来说,协程是用户空间内的“轻量级线程”,由程序员自己管理。和多线程相比,协程有几个显著的优势:

  1. 控制权在用户手中:线程的控制权在操作系统手中,而协程完全由用户控制,这减少了上下文切换的开销,提高了效率。

  2. 更轻量:线程需要分配较大的栈空间(通常是MB级别),而协程只需要几KB,因此可以在相同内存中运行更多的协程。

  3. 避免锁机制:因为协程是单线程的,不存在多线程的资源竞争问题,不需要加锁,避免了死锁和竞争状态,提高了执行效率。

协程特别适合用于I/O密集型任务,例如网络请求、文件读写等,但不适用于CPU密集型任务。因为协程的本质是单线程,在处理大量计算任务时,还是需要多进程或多线程来分担。

为什么选择httpx?

搞清楚了协程,咱们来看看今天的主角——httpx。httpx是一个支持异步HTTP请求的库,几乎继承了requests的所有特性,可以认为是requests的“升级版”。对于那些已经习惯了requests的开发者来说,httpx的上手几乎没有学习成本。

安装httpx非常简单,只需要在命令行中执行:

pip install httpx

使用httpx进行异步请求

先来看看如何用httpx实现异步HTTP请求吧。

同步请求示例

先回顾一下同步请求的写法,这里用requests库来做个对比:

import requests
import time


def sync_main(url, sign):
    response = requests.get(url)
    print(f'sync_main: {sign}: {response.status_code}')

sync_start = time.time()
[sync_main('http://www.baidu.com', i) for i in range(200)]
sync_end = time.time()
print(f'Total time for sync requests: {sync_end - sync_start} seconds')

​​​​​

这段代码发送了200次同步HTTP请求,并记录了总耗时。运行结果可能如下:

sync_main: 0: 200
...
sync_main: 199: 200
Total time for sync requests: 16.6 seconds

可以看到,同步请求的总耗时约为16.6秒。

异步请求示例

现在,用httpx来实现相同的功能,但这次使用异步请求:

import asyncio
import httpx
import time


async def async_main(url, sign):    
    async with httpx.AsyncClient() as client:        
        response = await client.get(url)        
        print(f'async_main: {sign}: {response.status_code}')

async def main():    
    tasks = [async_main('http://www.baidu.com', i) for i in range(200)]    
    await asyncio.gather(*tasks)

async_start = time.time()
asyncio.run(main())
async_end = time.time()
print(f'Total time for async requests: {async_end - async_start} seconds')

这段代码用httpx实现了异步HTTP请求。运行结果可能如下:

async_main: 0: 200
...
async_main: 199: 200
Total time for async requests: 4.5 seconds

可以看到,异步请求的总耗时约为4.5秒,比同步请求缩短了近73%!

深入理解httpx

httpx不仅仅是requests的替代品,它还提供了一些额外的功能,使其在实际应用中更加强大和灵活。

1. 并发请求

使用httpx,我们可以轻松地实现并发请求,提高数据抓取效率。例如:

import asyncio
import httpx


async def fetch(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.text

async def main(urls):
    tasks = [fetch(url) for url in urls]
    results = await asyncio.gather(*tasks)
    return results

urls = ['http://example.com' for _ in range(100)]
results = asyncio.run(main(urls))
print(f'Fetched {len(results)} pages')

这段代码演示了如何使用httpx并发地抓取多个网页,并将结果存储在一个列表中。通过这种方式,可以显著提高爬虫的效率。

2. 异步上下文管理

httpx提供了异步上下文管理器,确保在异步操作中正确地管理资源。例如:

import httpx
import asyncio


async def fetch(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response

async def main():
    response = await fetch('http://example.com')
    print(response.text)

asyncio.run(main())

在这个示例中,async with语句确保在异步操作完成后正确关闭HTTP客户端。

3. 超时和重试机制

在网络请求中,超时和重试机制是非常重要的。httpx提供了灵活的超时和重试配置:​​​​​​​

import httpx
import asyncio


async def fetch(url):
    async with httpx.AsyncClient(timeout=5.0) as client:
        response = await client.get(url)
        return response

async def main():
    try:
        response = await fetch('http://example.com')
        print(response.text)
    except httpx.TimeoutException:
        print('Request timed out')

asyncio.run(main())

​​​​​​​这里设置了一个5秒的超时时间,如果请求超过这个时间未完成,将抛出一个TimeoutException。

httpx在实际项目中的应用

虎哥最近在实际项目中使用httpx进行数据抓取,不得不说,效率真的提升了不少。尤其是在处理需要大量并发请求的场景时,httpx简直就是利器。

1. 数据抓取

在一个数据抓取项目中,需要抓取上千个页面的数据。使用httpx后,不仅代码简洁了很多,效率也提高了一倍以上。例如:

import asyncio
import httpx


async def fetch_data(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.json()

async def main(urls):
    tasks = [fetch_data(url) for url in urls]
    results = await asyncio.gather(*tasks)
    for result in results:
        print(result)

urls = [f'http://api.example.com/data/{i}' for i in range(100)]
asyncio.run(main(urls))

2. 接口测试

在接口测试中,httpx的异步特性也大有用武之地。例如,需要并发地测试多个API接口,可以使用以下代码:​​​​​​​

import asyncio
import httpx


async def test_api(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        assert response.status_code == 200

async def main(urls):
    tasks = [test_api(url) for url in urls]
    await asyncio.gather(*tasks)

urls = [f'http://api.example.com/test/{i}' for i in range(100)]
asyncio.run(main(urls))

end

如果你正在寻找一款能够替代requests,并且在性能和功能上更为出色的Python爬虫库,建议试试httpxaiohttp。它们不仅能满足你对爬虫效率的要求,还能大大简化代码的编写。

总的来说,httpx是一个非常强大且高效的HTTP请求库,尤其适合在需要大量并发请求的场景下使用。

如果你还在使用requests,不妨尝试一下httpx,感受一下异步请求带来的效率提升。

在选择爬虫库时,了解项目需求和库的特性至关重要。虽然requests仍然是处理简单任务的好帮手,但在面对复杂的大规模爬取任务时,httpxaiohttp无疑会为你带来更高的效率和更好的开发体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西北农林科技大学李毅研究员等人在农学顶刊Agric. Syst.发文:持续的干旱威胁着小麦和玉米生产,并将在未来扩大作物产量差

文章简介 论文名称:Concurrent drought threatens wheat and maize production and will widen crop yield gaps in the future (持续的干旱威胁着小麦和玉米生产,并将在未来扩大作物产量差) 第一作者及单位:Miaolei …

【EMC专题】以太网电路为什么在变压器次级侧加浪涌保护二极管?

以太网广泛应用于工业领域,会受到诸多恶劣条件的影响。一种特别恶劣的条件是 IEC61000-4-5 中强调的瞬态浪涌。浪涌瞬变对这些系统特别危险,因为这代表有较大功率耦合到以太网物理层的发送和接收电路,可能会损坏以太网控制器或 PHY。 以太网物理层包括以太网 PHY(或控制器)…

vue 实现简单AI聊天程序(一) elementui 聊天框编写

这个系列的目标是开发一个AI聊天前端界面后端问答程序, 探索前端界面开发。 尝试后端对接阿里云千问大模型,后续还会更新自己部署的大模型。 这一期用elmentui来开发一个聊天框的前端,根据用户发送的内容,AI会返回一个一模一样的…

中山大学和联想研究院提出文本到服装生成模型GarmentAligner,解决服装生成中语义对齐、数量、位置和相互关系等问题。

中山大学和联想研究院提出一个能够根据文字描述生成服装图像的智能工具GarmentAligner。它可以从已有服装图像中提取出各个组成部分,并记录下它们的位置和数量。接着根据你的描述进行匹配,找出最吻合的服装组件进行组合。而为了确保生成的图像能够准确反…

Nosql数据库redis集群配置详解

一、Redis的安装 环境介绍: 一主双从:10(redis-node1)主,20(redis-node2) 30(redis-node3)从——使用的是红帽9.1系统 源码安装redis [rootredis-node1 ~]# tar zxf red…

【yarn publish : 报错 passed folder/tarball doesn‘t exist 】

当执行yarn publish 时报错,具体命令类似 yarn publish --new-version ${NEW_VERSION} ${my-node-moudle-path}/my-node-modules 报错内容, 网上搜了一圈,基本没有这个报错的相关内容,最后分析并解决了,这里记录分享下…

NoSql数据库 - Redis Cluster集群详解及案例实现

Redis Cluster集群(无中心化设计) 1.1 Redis Cluster 工作原理 在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法…

查看exe文件所需要依赖库的方法

Windows 1.dumpbin /dependendsv [file_path]; 2.Qt windeployqt.exe打包 在exe的同一目录下生成需要的文件和库;如果不是qt程序结果如下:

发那科机床设备数据 转IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集发那科机床数据 2 5 用IEC61850协议转发数据 5 6 网关使用多个逻辑设备和逻辑节点的方法 7 7 案例总结 8 1 案例说明 设置网关采集发那科机床数据把采集的数据转成IEC61850协议转发给其他系统。 2 VFBOX网关…

Google Search Console:完整教程

Google 提供了各种工具来收集和分析网站数据,其中最有价值的工具之一是 Google Search Console (GSC)。前身为 Google Webmaster Tools,它为 SEO 提供了对网站性能的宝贵见解。自 2015 年推出以来,该平台取得了长足的发…

分库分表学习笔记(一)

图源(鹅厂技术架构师公众号) MySQL执行顺序: FROM:确定数据来源。JOIN:执行表之间的连接操作。WHERE:过滤记录。GROUP BY:对记录进行分组。HAVING:对分组结果进行过滤。SELECT&#…

如何用Java SpringBoot+Vue搭建美容美发管理系统?实战解析

🎓 作者:计算机毕设小月哥 | 软件开发专家 🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 🛠️ 专业服务 🛠️ 需求定制化开发源码提…

47.【C语言】指针(重难点)(J)

目录 26.自制排序函数(★★) *分析 *代码 往期推荐 26.自制排序函数 *分析 之前在42.【C语言】冒泡排序写过一个排序函数&#xff0c;可以将此自制一个类似qsort的函数 画圈的地方是需要修改的 #include <stddef.h> void bubble_sort(void* base, size_t num,size_t w…

Mac Cocos2d-x工程通过xcode编译时,提示无法找到SDK的解决办法

经过对整个macOS的升级&#xff0c;发现原来的Cocos2d-x4.0可编译的工程&#xff0c;无法运行。 Xcode错误提示 mac cocos2d-x 4 Showing All Messages unable to find sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.…

2024年不可错过的7款最佳UI和UX设计工具推荐

在数字产品的成功中&#xff0c;用户界面 (UI) 和用户体验 (UX) 都起着至关重要的作用。UI 和 UX 是网页设计中相互补充的两个重要方面。UI 主要关注用户界面的设计&#xff0c;而 UX 则涵盖用户与产品或服务互动时的整体体验。在本文中&#xff0c;我们将深入探讨 UX 和 UI 的…

vc矩阵计算(转置,点乘,逆矩阵)

vc计算矩阵的转置,矩阵的点乘,矩阵的逆矩阵,参考网上的例子 矩阵点乘的例子: 矩阵逆矩阵计算例子: #include "stdafx.h" #include <math.h> //#include<complex.h> #include <iostream> #include <complex> #include <cstdli…

短视频SDK解决方案,代码逻辑结构清晰,接入便捷

美摄科技凭借其在多媒体处理领域的深厚积累&#xff0c;推出了高效、易用的短视频SDK解决方案&#xff0c;为开发者及内容创作者提供了一站式的短视频创作与编辑工具&#xff0c;让每一份灵感都能轻松转化为引人入胜的视觉盛宴。 一、技术领先&#xff0c;打造极致体验 美摄科…

非局部均值降噪算法(NLM)原理及实现

文章目录 一、概述二、算法原理三、算法流程四、MATLAB实现五、C实现参考文献 一、概述 在日常生活中&#xff0c;最常见的 CT 图像噪声是高斯白噪声。目前&#xff0c;针对高斯白噪声的处理方法&#xff0c;主要有空间域中的以平滑为基本思想的均值滤波、高斯滤波、局部滤波等…

案例研究丨MaxKB+Ollama:深圳市公共信用中心探索信用服务创新

深圳市公共信用中心隶属于深圳市市场监督管理局&#xff0c;主要负责对外提供深圳市企业公共信用信息报告查询和深圳市企业注册登记档案查询等服务。作为深圳市信用信息的权威发布机构&#xff0c;深圳市公共信用中心一直致力于为公众提供准确、及时的信用信息服务。 深圳信用…

2024年医疗行业关键词:精益管理

随着医疗技术的飞速发展、患者需求的日益多元化以及医疗资源的日益紧张&#xff0c;精益管理作为一种高效、科学的管理模式&#xff0c;正逐步成为医疗行业转型升级的关键驱动力。具体表现如深圳天行健企业管理咨询公司下文所述&#xff1a; 1. 优化服务流程 首先&#xff0c;…