我们使用联盟链接。它们让我们能够维持运营,而您无需承担任何费用。

最好的 Python HTTP 客户端(Python 请求替代品)

正在寻找 Python Requests 的替代品?我们整理了一份最佳 Python HTTP 客户端列表供您尝试。

最佳 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 替代方案

Python HTTP 客户端

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 响应

虽然 httplib2 不像 Requests 库那么流行,但它提供了一些功能,使其成为网页抓取的绝佳选择。httplib2 具有内置缓存功能,可让您缓存 HTTP 响应 并避免发出不必要的请求。如果您想避免 1) 目标网站的服务器过载和 2) 由于您建立的连接过多而导致 IP 被阻止,此功能非常有用。httplib2 自动跟踪和处理 3XX 重定向 在 GET 上,使网页导航变得容易。Httplib2 的另一个优势是它内置了对处理 cookie 的支持。尽管 Httplib2 默认同步, 它支持 keep-alive 标头,允许您通过同一连接发送多个请求。此外,下载未压缩的数据会降低抓取工具的速度。httplib2 可以自动处理压缩 根据响应标头。这是使用 httplib2 发出 GET 请求的方法:
				
					import httplib2

http = httplib2.Http()

url = 'https://example.com'  
response, content = http.request(url, 'GET')
				
			

浏览 官方网站 了解更多信息。

比较表

 要求网址库3aiohttpHTTPX请求 httplib2
学习曲线简便简便简便
异步 没有没有没有
会议没有没有
HTTP / 2 没有没有没有没有没有
性能比较慢快速快速
社區L大号L大号L大号L大号S小号
Adam Dubois 的图片
亚当·杜波依斯
代理极客和开发人员。