返回博客
指南
Ștefan RăcilăLast updated on Mar 31, 20261 min read

如何使用 Python requests 模块连接代理服务器——终极指南

如何使用 Python requests 模块连接代理服务器——终极指南

引言

网络爬虫是一种强大的工具,可帮助您从网站中提取有价值的信息。然而,它也会给被爬取网站的服务器带来负担,因此许多网站会屏蔽发送过多请求的 IP 地址。为避免这种情况,您可以使用代理服务器进行请求。本文将向您展示如何在 Python 中使用代理,以及如何轮换代理 IP 以避免被封禁。

准备工作

开始之前,您需要满足以下先决条件:

✅ 已安装 Python

✅ 具备一定的 Python 编程经验

✅ 已安装 Python requests 库

✅ 一组代理 IP 和端口

要安装 Python,您需要从 Python 官方网站下载安装程序:https://www.python.org/downloads/

您可以选择 Python 3 的最新版本。建议使用最新版本的 Python,以获取最新的功能和安全更新。

下载完成后,运行安装程序并按照提示在计算机上安装 Python。安装过程中,请务必勾选将 Python 添加到系统 PATH 环境变量的选项,这样您就可以在命令行中运行 Python。

安装完成后,您可以通过打开命令提示符或终端并运行命令 `python --version` 来验证 Python 是否安装正确。这将显示您已安装的 Python 版本。

您可以通过打开终端并运行以下命令来检查 `python-requests` 包是否已安装:

$ pip freeze

`pip` 是一款包管理器,通常已随新版 Python 捆绑提供。若因故需单独安装 `pip`,请参考本指南中的说明。

`pip freeze` 将显示您当前安装的所有 Python 包及其版本。检查 `requests` 模块是否出现在该列表中。如果没有,请运行以下命令进行安装:

$ pip install requests

代理配置

本节将讲解如何使用 `python-requests` 配置代理。开始之前,我们需要一个可用的代理以及要发送请求的目标 URL。

基本用法

import requests

proxies = {

    'http': 'http://proxy_ip:proxy_port', 

    'https': 'http://secure_proxy_ip:proxy_port',

}

res = requests.get('https://httpbin.org/get', proxies=proxies)

如果您没有可用于测试此代码的私有代理,可以从 freeproxylists.net 上的列表中查找免费的公共代理。请注意,该网站上的代理不适用于任何生产环境,且可能不可靠。

`proxies` 字典的结构必须与代码示例中完全一致。您需要提供一个用于 HTTP 连接的代理和一个用于 HTTPS 连接的代理。这两个代理可以是不同的,也可以是同一个。您可以使用同一个代理处理多种协议。

另外请注意,我在两种连接的代理 URL 中都使用了 HTTP 协议。并非所有代理都拥有 SSL 证书。这两种情况下,与代理的连接都将通过 HTTP 建立。

要对代理进行身份验证,可使用以下语法:

http://user:pass@working-proxy:port

环境变量

如果您不打算使用多组代理,可以将它们导出为环境变量。

以下是在 Linux 终端中导出环境变量的方法

$ export HTTP_PROXY='http://proxy_ip:proxy_port'

$ export HTTP_PROXYS='http://secure_proxy_ip:proxy_port'

要查看环境变量,只需运行

$ env

以下是在 PowerShell 中导出环境变量的方法

>_ $Env:HTTP_PROXY='http://proxy_ip:proxy_port'

>_ $Env:HTTP_PROXYS='http://secure_proxy_ip:proxy_port'

要查看环境变量,只需运行

>_ Get-ChildItem -Path Env:

以下是在命令提示符中导出环境变量的方法

\> set HTTP_PROXY='http://proxy_ip:proxy_port'

\> set HTTP_PROXYS='http://secure_proxy_ip:proxy_port'

要查看环境变量,只需运行

\> set

这样,您无需在代码中定义任何代理。只需发出请求,它就会生效。

如何读取响应?

您可以通过多种方式读取数据,但在大多数情况下,您会希望以纯文本或 JSON 编码字符串的形式读取。

纯文本:

response = requests.get(url)

text_resp = response.text

JSON:对于 JSON 格式的响应,requests 包提供了一个内置方法。

response = requests.get(url)

json_resp = response.json()

代理会话

您可能还需要从使用会话机制的网站抓取数据。此时,您需要创建一个会话对象。首先创建一个名为 `session` 的变量,并将其赋值为 requests 库的 `Session()` 方法。接下来,您需要将会话的 `.proxies` 属性设置为代理信息。然后,使用已创建的 `session` 对象发送请求。此时,您只需将 URL 作为参数传入即可。

import requests

session = requests.Session()

session.proxies = {

    'http': 'http://proxy_ip:proxy_port',

    'https': 'http://secure_proxy_ip:proxy_port',

}

res = session.get('https://httpbin.org/get')

请务必将 `proxy_ip` 和 `proxy_port` 替换为代理的实际 IP 和端口。

如何轮换代理 IP

为避免被网站封禁,轮换代理 IP 至关重要。一种实现方法是创建一个包含代理 IP 和端口的列表,并在发送请求时随机选择代理。

以下是一个示例:

def proxy_request(url, **kwargs):

    while True:

        try:

            proxy = random.randint(0, len(ip_addresses) - 1)

            proxies = {

                'http': ip_addresses(proxy),

                'https': ip_addresses(proxy)

            }

           

            response = requests.get(url, proxies=proxies, timeout=5, **kwargs)

            print(f"Currently using proxy: { proxy['http'] }")

            break

        except:

            print("Error encoutered, changing the proxy...")

    return response

print(proxy_request('https://httpbin.org/get'))

聘请专业人士

虽然可以使用 Python 自行管理代理,但这过程十分耗时,且获取一套优质的代理可能需要大量时间和金钱。为了节省时间和金钱,您可以使用专业的爬虫工具。WebScrapingAPI 具备内置的代理管理和轮换功能。 我们拥有经过验证的高质量代理池,这些代理更可靠,从长远来看能为您节省时间和金钱。

我们还提供可免费试用的代理模式。只需注册账户并开始 WebScrapingAPI 试用,即可获取免费 API 密钥。以下是使用我们代理模式的代码示例:

import requests

def get_params(object):

    params = ''

    for key,value in object.items():

        if list(object).index(key) < len(object) - 1:

            params += f"{key}={value}."

        else:

            params += f"{key}={value}"

    return params

API_KEY = '<YOUR_API_KEY>'

TARGET_URL = 'http://httpbin.org/get'

PARAMETERS = {

    "proxy_type":"datacenter",

    "device":"desktop"

}

PROXY = {

    "http": f"http://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:80",

    "https": f"https://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:8000"

}

response = requests.get(

    url=TARGET_URL,

    proxies=PROXY,

    verify=False

)

print(response.text)

请注意,若需通过 https 连接代理模式,您的代码必须配置为不验证 SSL 证书。在此情况下,由于您使用的是 Python Requests 库,应设置 `verify=False`。

要点

使用代理是避免在网页抓取过程中被封禁的有效方法。通过轮换代理 IP 并使用代理池,您可以降低被封禁的风险并提高成功率。然而,自行管理代理可能很麻烦,且获取一套优质的代理可能需要花费大量时间和金钱。

订阅 WebScrapingAPI 等高级代理服务后,您将获得多种功能,例如 IP 轮换以及在数据中心代理和住宅代理之间切换的能力。

希望本文能帮助您更好地了解如何在 HttpClient 中使用代理,以及它如何满足您的网页抓取需求。立即注册我们的 14 天免费试用,亲身体验我们的服务,并了解其所有功能和特性。

关于作者
Ștefan Răcilă, 全栈开发工程师 @ WebScrapingAPI
Ștefan Răcilă全栈开发工程师

Stefan Racila 是 WebScrapingAPI 的 DevOps 及全栈工程师,负责开发产品功能并维护确保平台稳定运行的基础设施。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。