跳到内容

在 Python 请求中使用代理的完整指南

如果您正在编写 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_PROXYHTTPS_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 禁令至关重要。通过此处概述的技术,您可以像专业人士一样利用代理!

有关更高级的代理用法,请参阅 请求文档。现在继续使用你新发现的代理权力吧!如果您还有其他代理问题,请告诉我。

标签:

加入谈话

您的电邮地址不会被公开。 必填带 *