你总是用 Python 进行网络抓取吗?那么,你一定也和我一样,对 Urllib、Urllib3 和 Requests 这三者之间哪个是最好的 HTTP 客户端感到困惑。
是的,在 Python 编程中,处理 HTTP 请求是一个常见的需求。
Python 提供了多种库来实现这一功能,Urllib、Urllib3 和 Requests 是其中最常用的三个库。
它们有什么特别之处?哪个适合你?
它们各自都有独特的功能和优缺点。开始阅读这篇文章,找出答案吧!
库 | Urllib | Urllib3 | Requests |
---|---|---|---|
是否需要安装 | 否 | 是 | 是 |
速度 | 中等 | 快 | 中等 |
响应处理 | 通常需要解码步骤 | 不需要额外的解码步骤 | 不需要额外的解码步骤 |
连接池 | 不支持 | 支持 | 支持 |
易用性 | 语法复杂,学习曲线陡峭 | 易用 | 易用,更适合初学者 |
Urllib 是 Python 标准库的一部分,用于处理 URL,不需要安装任何额外的库。
当你使用 Urllib 发送请求时,它返回的是响应对象的字节数组。然而,我必须说,它返回的字节数组需要额外的解码步骤,这对于初学者来说可能具有挑战性。
urllib
允许通过低级接口进行更精细的控制,但这也意味着需要编写更多代码。因此,用户通常需要手动处理 URL 编码、请求头设置和响应解码。
但不要紧张!Urllib 提供了基本的 HTTP 请求功能,例如 GET 和 POST 请求,它还支持 URL 解析、编码和解码。
优点:
缺点:
Urllib
适用于 简单任务,例如 HTTP 请求,特别是在你不想安装第三方库时。
它也可以用于 学习和理解底层原理。用户可以用它来学习和理解 HTTP 请求的底层实现。
然而,由于 urllib
缺乏连接池管理、默认压缩和 JSON 处理等高级功能,对于复杂的 HTTP 请求来说,它的使用相对繁琐。
Urllib3
提供了高级抽象,包括请求 API、连接池、默认压缩、JSON 编码和解码等。
使用这些功能非常简单!你只需几行代码就能自定义 HTTP 请求。Urllib3
使用 C 扩展来提高性能,因此 在这三者中速度最快。
Urllib3
提供了更高级的接口。它还支持连接池、自动重试、SSL 配置和文件上传等高级功能:
优点:
urllib
提供了更多高级功能,如连接池、文件分块上传、重试请求等。urllib
简单,减少了编码复杂度。缺点:
urllib3
(pip install urllib3
)。用户可以将 urllib3
用于一些 复杂的 HTTP 请求,例如处理并发请求、连接池管理等。
Urllib3
也适用于一些需要更高性能和稳定性的需求。
Requests
是一个流行的 HTTP 请求库。它以简单的 API 设计和强大的功能而闻名,使与网络的交互变得非常容易。
通过 Requests
发送 HTTP 请求将变得非常简单和直观。此外,它还具有处理 cookie、会话、代理设置和 JSON 数据等内置功能,确保了用户友好的体验。
它还有一些强大的功能:
优点:
Requests
提供了最简单和最易理解的 API,因此发送 HTTP 请求非常容易。urllib3
。底层使用 urllib3
,结合了高性能和高级功能,同时隐藏了复杂性。缺点:
Requests
(pip install requests
)。Requests
适用于几乎所有 HTTP 请求场景,尤其是网络爬虫和 API 请求。由于其简洁的语法和丰富的文档,它也特别适合初学者。
根据基准测试结果,这三者在 100 次迭代中的性能如下:
Urllib
第二快:平均请求时间为 1.18 秒。虽然是纯 Python 实现,但由于其底层实现,性能较好。Urllib3
最快:平均请求时间为 0.33 秒。这归功于其 C 扩展和高效的连接池管理。Requests
最慢:平均请求时间为 1.73 秒。但其易用性和丰富的功能弥补了这一缺点。urllib
。它是标准库的一部分,不需要单独安装。urllib3
是一个不错的选择。requests
是理想的选择。它是最用户友好的库,广泛用于网络爬虫和 API 请求。许多网站集成了反爬虫系统来检测和封锁自动化脚本,如网络抓取工具。因此,绕过这些封锁以访问数据至关重要!
一种避免检测的方法是使用 Nstbrowser 避免 IP 封锁。Urllib 和 urllib3 也内置了在 HTTP 请求中添加代理的能力。
Nstbrowser 设计了 IP 轮换和网页解封功能。
免费试用 Nstbrowser,避免 IP 封锁!
您对网页抓取和 Browseless 有什么好的想法或疑惑吗?
快来看看其他开发人员在 Discord 和 Telegram 上分享了什么!
在开始之前,你需要满足一些条件:
以下是具体步骤。我们将以抓取 亚马逊网站 上一个页面的内容标题为例。
如果我们需要抓取以下网页的 h3 标题内容:
我们应该运行以下代码:
import json
from urllib.parse import urlencode
from playwright.async_api import async_playwright
async def main
():
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(
'wss://browser.nstbrowser.io/v1/{workspace}/{project-id}/{API Key}')
page = await browser.new_page()
# 这里输入抓取目标页面的URL
url = 'https://www.amazon.com/s?bbn=16225007011&rh=n%3A16225007011%2Cn%3A' \
'18464062011&dc&fst=as%3Aoff&qid=1614317724&rnid=16225007011&ref=lp_16225007011_nr_n_7'
await page.goto(url)
# 提取 h3 标题内容
titles = await page.query_selector_all('h3')
for title in titles:
print(await title.inner_text())
await browser.close()
if __name__ == '__main__':
import asyncio
asyncio.get_event_loop().run_until_complete(main())
在运行此代码之前,请确保:
在这部分中,我们将使用 urllib
和 urllib3
来避免 IP 封锁,演示如何在 HTTP 请求中添加代理。
以下是一些示例代码,展示了如何为 urllib
和 urllib3
设置代理:
urllib
设置代理import urllib.request
proxy = urllib.request.ProxyHandler({
'http': 'http://your-proxy-server:port',
'https': 'https://your-proxy-server:port'
})
opener = urllib.request.build_opener(proxy)
urllib.request.install_opener(opener)
# 发送 HTTP 请求
response = urllib.request.urlopen('http://www.example.com')
print(response.read().decode('utf-8'))
urllib3
设置代理import urllib3
http = urllib3.ProxyManager('http://your-proxy-server:port')
# 发送 HTTP 请求
response = http.request('GET', 'http://www.example.com')
print(response.data.decode('utf-8'))
这两种方法将有助于你在使用网络抓取时避免 IP 封锁。
你也可以使用 Nstbrowser 提供的代理服务,该服务设计了 IP 轮换和网页解封功能,可以有效绕过反爬虫系统。
Urllib
、Urllib3
和 Requests
各有优缺点。根据项目的不同需求和复杂性,你可以选择最适合的 HTTP 客户端。
如果你的需求很简单,且不想安装额外的库,选择 Urllib
。如果你需要高性能和高级功能,选择 Urllib3
。如果你需要一个简单易用的 HTTP 客户端,特别适合网络爬虫和 API 请求,选择 Requests
。
同时,避免 IP 封锁的方法也很重要。可以使用 Nstbrowser 避免 IP 封锁,或者使用 Urllib 和 Urllib3 内置的代理功能。
希望这篇文章能帮助你在网络抓取时作出更好的选择!