返回博客
指南
斯特凡·拉西拉2023年4月20日阅读时长:6分钟

如何利用 Python 请求模块使用代理服务器 - 终极指南

如何利用 Python 请求模块使用代理服务器 - 终极指南

导言

网络搜刮是一种强大的工具,可以让你从网站中提取有价值的信息。不过,这也会给你正在进行搜刮的网站的服务器造成压力,这就是为什么许多网站会阻止发出过多请求的 IP 地址。为了避免这种情况,你可以使用代理来进行请求。在本文中,我将向你介绍如何使用 Python 和代理,以及如何轮换代理 IP 以避免被屏蔽。

设置

在开始之前,您需要具备以下先决条件:

✅ 已安装 Python

✅ 一定的 Python 使用经验

✅ 还安装了 Python 请求库

代理 IP 和端口列表

要安装 Python,您需要从 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 上的列表中查找免费的公共代理。请注意,该网站上的代理并不适用于任何生产环境,而且可能并不可靠。

代理 "字典的结构必须与示例代码中的结构完全相同。您需要为 HTTP 连接提供一个代理,为 HTTPS 连接提供一个代理。代理可能不同,也可能不一样。您可以为多个协议使用同一个代理。

另外请注意,我在两个连接的代理 URL 中都使用了 HTTP 模式。并非所有代理都有 SSL 证书。在这两种情况下,与代理的连接都将使用 HTTP。

使用此语法可对代理进行身份验证:

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

环境变量

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

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

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

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

要检查环境,只需运行

$ 环境

以下是在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'

要检查环境,只需运行

\> 设置

这样,您就无需在代码中定义任何代理。只需发出请求,就能正常工作。

如何阅读回复?

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

纯文本:

response = requests.get(url)

text_resp = response.text

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

response = requests.get(url)

json_resp = response.json()

代理会话

您可能还想从使用会话的网站上抓取数据。在这种情况下,您需要创建一个会话对象。首先创建一个名为 `session` 的变量,并将其分配给请求的 `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内置代理管理和轮换功能。我们拥有经过验证的高质量代理服务器池,这些代理服务器更加可靠,从长远来看可以为您节省时间和金钱。

我们还有一个代理模式,您可以免费试用。要获得免费的 API 密钥,您只需注册一个账户并开始试用WebScrapingAPI。这是如何使用代理模式的代码示例:

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
斯特凡·拉西拉全栈开发工程师

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

开始构建

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

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