如果您正在编写 Python 抓取工具或爬虫,那么配置代理支持应该是您的首要任务。代理允许您通过中间服务器路由您的请求,隐藏您的真实位置。这带来了许多可能性,例如大规模抓取网站而不会被阻止或访问仅限于某些区域的内容。
在这份综合指南中,我将介绍通过 Python 的 requests 模块使用代理所需了解的所有内容。我将解释代理为何有用、它们如何工作、从哪里获取代理、身份验证和安全性的最佳实践以及如何实现代理轮换。跟着我,我会让你成为代理专家!
为什么代理对于 Python 抓取工具至关重要
我们首先来看看为什么代理对于 Python 抓取工具如此重要:
刮擦时避免被堵塞
在 Python 请求中使用代理的第一个原因是避免 IP 禁令。许多网站都有适当的保护措施来阻止抓取工具和机器人。在将给定 IP 列入黑名单之前,他们可能会允许每分钟一定数量的请求。
从代理服务器轮换池中进行抓取会让您看起来像许多不同的用户。与从单个住宅 IP 进行抓取相比,网站将更难检测和阻止您。
为了让您了解规模,网站在触发禁令之前可能允许每个 IP 每分钟 60-100 个请求。即使只有少数代理,您也可以轻松地将抓取能力提高十倍。代理可实现可扩展性。
访问受地理限制的内容
代理的另一个好处是能够访问仅限于某些区域的内容。例如,BBC iPlayer 视频流服务仅适用于英国居民。通过英国代理路由您的流量,您可以像在伦敦一样查看该网站。
其他著名的例子包括 Hulu(仅限美国)、Channel 4(英国)和 NHK World(日本)。代理为您提供从任何地方访问区域限制内容的选项。
匿名与安全
隐藏您的真实 IP 地址还可以增强抓取时的隐私性。网站将无法轻松地将请求追溯到您的位置或身份。
威胁行为者还可能利用代理来掩盖攻击,但这超出了本文的范围。我们将重点关注增强网络抓取隐私和匿名性的积极作用。
缩放 Python 刮刀
代理允许您发出更多并行请求,因为您不受单个住宅 IP 容量的限制。
您可以通过多个代理路由请求,以增加每分钟可以发出的请求,而不是达到线程限制或被单个 IP 阻止。
如果每个代理允许 60 个请求/分钟,则 4 个代理将为您提供 240 个请求/分钟的容量。 10 个代理可扩展至 600 个请求/分钟。代理对于在 Python 中构建分布式、大容量的抓取工具至关重要。
现在您已经了解了代理为何有用,让我们深入了解它们如何工作的细节......
代理如何工作:匿名您的请求
代理充当您和目标服务器之间请求的中介:
您的请求首先通过代理服务器路由,而不是直接从您的 IP 连接到目标站点。这会掩盖您的真实 IP,使其不被目标识别。
这是通过将 HTTP 请求配置为使用代理的 IP 地址而不是您自己的 IP 地址来实现的。稍后我们将详细介绍如何在 Python 中配置它。
关于代理如何运作的一些关键说明:
代理有自己唯一的 IP,流量似乎来自该 IP。 这会隐藏您的真实 IP,并将其替换为代理 IP。
代理可以链接在一起以获得额外的匿名性。 您可以通过多个代理路由流量以进一步混淆来源。
代理协议,例如 HTTP 和 SOCKS 处理通过的交通。 这是在应用层针对请求进行配置的。
现在您已经了解了代理在基本层面上的工作原理,让我们来了解一下可用的不同类型的代理。
HTTP 与 SOCKS 代理
两个主要的代理协议是 HTTP 和 SOCKS。让我们比较一下它们:
HTTP代理
HTTP 代理是您会遇到的最常见的类型。一些关键属性:
- 仅适用于 HTTP/HTTPS 流量 (不是较低级别的 TCP/UDP)
- 设置简单 – 与大多数库和工具兼容
- 通常用于网页抓取和一般网页访问
HTTP 代理本质上拦截客户端发出的 HTTP 请求并将其转发到目的地。它们仅限于 HTTP 流量。
SOCKS 代理
SOCKS 是一种功能更全的代理协议,运行在较低的网络层上。
一些特点:
- 适用于任何 TCP 流量,包括HTTP、HTTPS、FTP等。
- 添加了身份验证和安全功能 就像用户名/密码验证一样。
- 通常用于完整的网络访问和匿名。
而 HTTP 代理仅在应用程序级别运行, SOCKS 位于网络/传输层的较低位置。这允许 SOCKS 代理几乎任何 TCP 流量。
你应该使用哪个?
对于大多数网页抓取用例,HTTP 代理就足够了。它的设置更简单,您只需关心通过代理定向您的 HTTP 请求。
如果您需要 HTTP 之外的较低级别流量的完整网络访问路由,请使用 SOCKS 代替。 SOCKS 如果您优先考虑增加安全性并且需要身份验证,那么也更好。
对于我们专注于 Python 网络抓取工具的用途来说,HTTP 代理非常适合。现在让我们看看从哪里获取代理服务器。
从哪里获取网页抓取代理
获取用于 Python 请求的代理有几种主要方法:
1. 从代理提供商处购买代理
最简单的方法是从代理服务购买代理。一些顶级提供商包括:
亮数据 – 我最喜欢的提供商,在全球范围内拥有高质量的住宅 IP。快速连接和可靠的正常运行时间。
氧实验室 – 数据中心代理可供所有区域支持大容量。价格实惠。
GeoSurf – 专门为特定国家/地区提供住宅代理以访问地理限制内容。
每个代理预计每月支付 1-5 美元左右,具体取决于提供商的质量和位置。代理服务 API 可以轻松加载新代理列表以集成到您的代码中。
2. 查找公开可用的代理
您还可以在线找到免费的公共代理。请注意,这些内容的质量较低,因为它们是共享的。公共代理使用率很高,并且经常离线。
查找公共代理的有用地方:
我不建议仅仅依赖公共代理,但它们可以在紧要关头增强付费代理。预计正常运行时间/速度会降低。
3. 部署您自己的代理
您还可以通过在住宅轮换 IP、云实例或 VPN 等基础设施上部署代理服务器来创建自己的私有代理。
这为您提供了控制权,但需要付出更多努力来配置和维护代理服务器。通常,为了简单起见,您会将代理配置外包给提供商。
总之,我建议从 BrightData 等信誉良好的提供商那里购买代理,除非预算严重有限。可靠性和质量胜过处理棘手的公共代理。
接下来让我们深入研究代码,看看如何使用代理配置 Python 请求......
设置代理 – Python 请求示例
Python 请求使您可以轻松地通过代理服务器引导流量。
您可以通过创建指定代理 proxies
将 URL 方案映射到代理 URL 的字典:
proxies = {
‘http‘: ‘http://10.10.1.10:3128‘,
‘https‘: ‘http://10.10.1.10:1080‘
}
然后在发出请求时传递此代理字典:
response = requests.get(‘https://example.com‘, proxies=proxies)
这将通过指定的代理路由所有 HTTP 和 HTTPS 请求。
您还可以为所有请求全局设置代理或按请求设置代理。让我们看一下使用 Python 请求的不同代理配置的示例。
所有请求的全局代理
要将代理全局应用于通过请求会话发出的所有请求,请在会话级别设置代理字典:
import requests
session = requests.Session()
proxies = {
‘http‘: ‘http://10.10.1.10:3128‘,
‘https‘: ‘http://10.10.1.10:1080‘
}
session.proxies = proxies
response = session.get(‘https://example.com‘)
# Uses HTTP proxy http://10.10.1.10:3128
您也可以通过设置环境变量来做到这一点 HTTP_PROXY
和 HTTPS_PROXY
在运行脚本之前。
每个请求的代理
要仅对特定请求使用代理,请将代理字典作为该调用的参数传递:
import requests
response = requests.get(‘https://example.com‘) # no proxy
proxied_response = requests.get(‘https://example.com‘, proxies={
‘http‘: ‘http://10.10.1.10:3128‘,
‘https‘: ‘http://10.10.1.10:1080‘
}) # uses proxy
这会覆盖仅针对这一请求的全局代理。
特定域的代理
要仅代理某些域的流量,请在代理字典中指定域:
proxies = {
‘http://scrape-site.com‘: ‘http://10.10.1.10:3128‘,
‘https://api.example.com‘: ‘http://10.10.1.10:1080‘,
}
requests.get(‘http://scrape-site.com/‘, proxies=proxies) # uses proxy
requests.get(‘http://no-proxy-domain.com‘, proxies=proxies) # no proxy
这允许对哪些站点使用代理或不使用代理进行精细控制。
现在您知道如何应用代理,让我们讨论如何使用代理进行身份验证......
使用代理进行身份验证
许多代理需要身份验证才能使用它们。这涉及到在代理 URL 中传递用户名/密码凭据。
以下是带有身份验证的 HTTP 代理 URL 示例:
http://myusername:[email protected]:8080
很简单,但如果您的用户名或密码包含特殊字符,则需要额外考虑。
许多特殊字符,例如 @
和 :
在基本 URL 语法中无效。为了处理这些情况,我们需要 URL编码 的凭证 urllib
图书馆:
from urllib.parse import quote
username = ‘[email protected]‘
password = ‘pass#123‘
proxy_url = f‘http://{quote(username)}:{quote(password)}@123.45.6.7:8080‘
这将正确编码这些值,以便它们可以在 URL 中传递。
现在您的凭据可以包含特殊字符,并且您可以成功进行身份验证。
解决了这个问题,让我们继续讨论轮换代理……
轮换代理以避免禁令
抓取网站时,您需要在多个代理 IP 之间轮换请求。这可以防止您因从单个 IP 发出过多请求而被网站禁止。
这是在 Python 中实现代理轮换的一种方法:
import requests
from random import choice
proxy_list = [
‘http://123.45.6.7:8080‘,
‘http://98.76.54.3.2:8080‘,
‘http://103.47.99.2:8080‘
]
for _ in range(10):
proxy = choice(proxy_list)
response = requests.get(‘https://example.com‘, proxies={
‘http‘: proxy,
‘https‘: proxy
})
# Do something with response...
我们维护一个代理 URL 列表。在每次请求之前,我们使用 Python 随机选择一个代理 random.choice()
。这会根据每个请求轮换代理。
您可以从文件、代理 API、数据库或其他来源加载代理列表。定期刷新它,以便在旧代理变坏时循环使用新代理。
理想情况下,至少使用 10 个以上代理,并至少每 100 个请求更改一次以确保安全。越多越好。
请务必在生产刮刀中实施类似的代理轮换,以保持在雷达之下。
关于 Python 请求代理的最终想法
现在您已经有了 – 通过 Python 的 requests 模块使用代理的综合指南!
我们介绍了代理对于 Python 网络抓取工具的重要性、它们在幕后如何工作、在哪里获取代理、如何配置使用代理的请求、身份验证和代理轮换模式。
代理对于成功大规模抓取网站和避免 IP 禁令至关重要。通过此处概述的技术,您可以像专业人士一样利用代理!
有关更高级的代理用法,请参阅 请求文档。现在继续使用你新发现的代理权力吧!如果您还有其他代理问题,请告诉我。