最好的 Python HTTP 客户端(Python 请求替代品)
正在寻找 Python Requests 的替代品?我们整理了一份最佳 Python HTTP 客户端列表供您尝试。
什么是 Python HTTP 客户端?
HTTP 客户端 用于发出 GET 或 POST 等 HTTP 请求的库 与 Web 服务器通信并从中检索信息。本质上,Python HTTP 客户端会从网页中获取原始 HTML。
然而,原始 HTML 数据非常混乱,无法读取。这就是为什么 HTTP 客户端通常与解析库配对 比如 Beautiful Soup 或 lxml。此外,HTTP 客户端可能不适用于所有目标。如果您想从使用 JavaScript 加载其内容的动态网站中提取数据,您需要一个 无头浏览器库 喜欢 Selenium 或 Puppeteer.
对于网络抓取目的,HTTP 客户端通常与 代理服务器。更改 IP 地址和位置对于项目的成功至关重要。为什么?因为如今的网站受到良好的保护,并且应用了各种 反机器人技术 阻止你获取信息。
为什么 Python Requests 如此受欢迎?
请求是 这是网络抓取老手和初学者的首选。 与其他 HTTP 客户端相比,Requests易于使用,并且只需编写更少的代码即可获取数据。
有请求, 您不需要手动向目标 URL 添加查询字符串。 它基于 Python 的 urllib3 库构建,允许您在会话内发出请求。
如果你的目标网站有官方 API,Requests 允许你 直接连接到 API 并获取特定信息。Requests 与其他 HTTP 客户端的不同之处在于它有一个内置的 JSON 解码器。它允许您仅用几行代码检索和解码 JSON 数据。
在所有功能中,请求可以 自动遵循并处理 HTTP 重定向 并根据响应标头对内容进行解码,从而更轻松地处理压缩数据。此外,该库还附带 SSL 验证和连接超时功能。
请求是 在处理网页抓取任务(如处理 cookies)方面具有灵活性、标头和错误。但是,默认情况下它是同步的,因此您无法一次发送多个请求。
以下是使用 Requests 发出 GET 请求的示例:
import requests
def main():
url = 'https://example.com'
response = requests.get(url)
为什么要寻找 Python 请求替代方案?
Python 的 Requests 库多年来一直很受欢迎,但它也有一些限制:
- 性能 一些替代库比 Requests 更快。
- 附加功能。 其他库可能提供 Requests 所不具备的功能:例如 HTTP/2 支持或自动缓存。
- 异步功能。 异步网页抓取允许您并行从多个页面收集数据,而 Requests 库不支持此功能。
用于网页抓取的最佳 Python Requests 替代方案
1. urllib3 – 用于处理多个请求的快速 HTTP 客户端
urllib3 库是另一个 同步 Python HTTP 客户端。 创建者自己表示,它带来了许多其他标准库所不具备的功能。因此,尽管 urllib3 不如 Requests 那么用户友好,但它仍然是一个受欢迎的选择。
首先,urllib3 是 设计为线程安全的。 它允许您使用多线程等技术 - 将网页抓取任务分成多个线程。该库支持并发请求,因此您可以同时抓取多个页面。
图书馆的另一个巨大好处是 允许连接池。 简单来说,它不是在每次请求时都打开一个新连接,而是调用 Get() 函数来访问现有连接。从性能方面来看,该功能使 urllib3 快速高效,因为它需要的计算资源比 Requests 少。此外,您可以通过单个连接处理多个请求。
然而,使用连接池有一些缺点—— 它不支持 cookies,因此您必须将它们作为标题值传递。
此外,urllib3 支持 SSL/TLS 加密 并允许您指定连接超时并设置重试。该库还处理重试和重定向。
以下代码使用 urllib3 库发送 GET 请求:
import urllib3
http = urllib3.PoolManager()
url = 'https://www.example.com'
response = http.request('GET', url)
浏览 官方网站 有关进一步说明。
2. aiohttp – 强大的异步 Web 抓取库
aiohttp 是一个专为 异步网页抓取。 在需要高并发性的情况下,它效果最佳。
aiohttp 建立在 asyncio 库之上,支持异步 I/O 操作来处理请求和响应。这意味着它 可以管理多个异步请求 不会阻塞主程序的执行。因此,您的抓取工具可以在等待响应的同时执行其他任务。
像 Requests、aiohttp 一样 支持标准 HTTP 方法。 它可以处理各种请求和响应类型。
而且,该库不仅限于作为 HTTP 客户端; 它还用于开发 Web 应用程序和 API 可以处理大量异步连接。虽然这不是网页抓取的主要用例,但当您想要为网页抓取工具创建自定义 API 或端点或在高并发环境中发出 HTTP 请求时,它非常有用。
此外,aiohttp 支持会话管理 它允许您在请求之间保持状态。例如,您可以使用它来管理 Cookie、存储会话数据或处理身份验证。此外,您还可以添加插件、中间件或修改请求标头。
这是使用 aiohttp 发出异步请求的示例:
import aiohttp
import asyncio
async def main():
async with aiohttp.ClientSession() as session:
async with session.get("https://example.com") as response:
print(await response.text())
asyncio.run(main())
参考 官方网站 有关进一步说明。
3. HTTPX – 支持 HTTP/2 和异步请求
HTTPX 是一个功能丰富的 HTTP 客户端 用于所有类型的网络抓取项目。
图书馆 默认支持同步API, 但是你可以 还使用 HTTPX 进行异步网页抓取。 实际上,后者是首选方法,因为它性能更好,并且允许您使用像 WebSocket 这样的连接。
此外,HTTPX 支持 HTTP/2,与 HTTP/1 相比,它可以降低您的阻塞率。它使用单个 TCP 连接,可以同时并发加载资源。这使得网站更难跟踪您的浏览器指纹。此列表中的所有库均不具备此功能。
HTTPX 库的另一个巨大好处是 内置对流式响应的支持。 如果您要下载大量数据但又不想一次将整个响应加载到内存中,则此功能很有用。
HTTPX包括 JSON 的自动解码。 因此,当您收到来自 HTTP 请求的响应时,如果响应主体是 JSON,HTTPX 会检测并处理响应主体。
性能方面,HTTPX 比 Requests 快,但比 Aiohttp 库慢。更重要的是,它 默认情况下不遵循重定向。
让我们看看如何使用 HTTPX 发出 GET 请求:
import httpx
import asyncio
async def main():
url = 'https://example.com'
async with httpx.AsyncClient() as client:
response = await client.get(url)
asyncio.run(main())
参考 官方网站 获取更多信息。
4. GRequests – Requests 库的异步补充
GRequests建立在Requests库之上,但 处理异步请求的能力。 它是一个用户友好的库,通常与 Requests 一起使用。
GRequests通过Gevent等库利用Python的异步功能,因此您可以 一次发送多个 HTTP 请求。
图书馆 可以集成到现有的网页抓取项目中 使用 Requests 库。最好的部分是 – 您不必重写整个代码库。
如果你已经熟悉 Requests,那么使用 GRequests 相对简单。 它具有类似的语法和方法来发出 HTTP 请求,并且该库具有许多相同的功能。但是, 这不是一个非常受欢迎或者积极维护的图书馆。
以下是使用 GRequests发出GET请求的示例:
import grequests
urls = ['https://example.com', 'https://example.org']
requests = (grequests.get(url) for url in urls)
responses = grequests.map(requests)
看一看 GitHub上 获取更多信息。
5. httplib2 – 非常适合缓存 HTTP 响应
import httplib2
http = httplib2.Http()
url = 'https://example.com'
response, content = http.request(url, 'GET')
浏览 官方网站 了解更多信息。
比较表
| 要求 | 网址库3 | aiohttp | HTTPX | 请求 | httplib2 | |
| 学习曲线 | 简便 | 简便 | 中 | 中 | 中 | 简便 |
| 异步 | 没有 | 没有 | 是 | 是 | 是 | 没有 |
| 会议 | 是 | 没有 | 是 | 是 | 是 | 没有 |
| HTTP / 2 | 没有 | 没有 | 没有 | 是 | 没有 | 没有 |
| 性能 | 比较慢 | 快速 | 快速 | 中 | 中 | 中 |
| 社區 | L大号 | L大号 | L大号 | L大号 | S小号 | 中 |