如何在 AIOHTTP 中设置代理

4 min read
aiohttp proxy

本 AIOHTTP 代理集成指南包含以下内容:

  • AIOHTTP 是什么?
  • 为什么要使用代理?
  • 如何在 AIOHTTP 中设置 HTTP、HTTPS 或 SOCKS 代理?
  • 如何处理代理身份验证、SSL 证书错误、IP 轮换等?

AIOHTTP 是什么?

AIOHTTP 是一种主流开源 Python 异步 HTTP 客户端/服务器框架。其主要特征如下:

  • 支持客户端和服务器端的 HTTP 协议。
  • 支持客户端和服务器端 Web 套接字。
  • 提供具有中间件和可插拔路由的 Web 服务器。

本教程将重点介绍 AIOHTTP 充当 HTTP 客户端基于 asyncio 执行 HTTP 请求这一能力。AIOHTTP 特别适用于构建需要高效处理多个并发请求的脚本。

截至撰写本文时,AIOHTTP 在 GitHub 上已累积超过 14,000 颗星

为什么需要 AIOHTTP 代理?

之所以在 AIOHTTP 中使用代理,其中一个重要原因是可以保护在线身份。将请求路由至代理服务器有助于隐藏 IP 和位置,让目标网站误认为请求来自代理服务器,而非真实用户。因此,目标网站很难识别并跟踪真实用户的身份,这可增加在线操作的保密性,同时可避免 IP 封禁和地域限制。

请注意,使用 requests 也可以实现同样的效果,相关内容详见 requests 代理集成教程

在 AIOHTTP 中设置代理

本章节将逐步介绍如何在 AIOHTTP 中设置 HTTP、HTTPS 或 SOCKS 代理。

AIOHTTP 先决条件

假设您的计算机上已安装 Python,并且已为 Python 项目设置虚拟环境。使用以下命令安装 AIOHTTP 以及推荐的依赖项:

pip install aiohttp[speedups]

aiohttp 随即添加到项目的依赖项中。

打开 Python 脚本文件,添加 aiohttp 导入语法:

import aiohttp

要让 aiohttp 使用 async/await 语法,必须使用 asyncio。因此,还需要导入该库并设置基本的 async main() 函数:


import aiohttp
import aiohttp

import asyncio

async def main():
  # aiohttp logic...

asyncio.run(main())

完美!现已一切就绪,可以编写 AIOHTTP 代理集成逻辑了!

代理先决条件

在了解如何在 AIOHTTP 中集成代理之前,需要先了解代理 URL 的格式。

在 AIOHTTP 中连接代理服务器所需的 URL 格式如下所示:

<PROTOCOL>://[<USERNAME>:<PASSWORD>@]<HOST>[:<PORT>]

具体而言,URL 包含以下部分:

  • <PROTOCOL>http 适用于 HTTP 代理,https 适用于 HTTPS 代理,sockssocks4socks5 适用于使用不同 SOCKS 协议的代理。
  • <HOST>:代理服务器的 IP 或完整域名(例如 proxydomain.com)。
  • <PORT>:代理服务器监听的端口。
  • <USERNAME>:用于验证代理连接的用户名(选填)。
  • <PASSWORD>:用于验证代理连接的密码(选填)。

请注意,在 URL 中,仅 <PROTOCOL><HOST> 为必填部分。<PORT> 为选填部分,但通常必须指定。最后,只有在处理需要身份验证的代理时才需要凭据部分,即 <USERNAME>:<PASSWORD>

如果没有代理服务器的 URL,可免费在线申请。同时请记住,免费代理不可靠、耗费流量、不稳定、容易出错且非法,只能用于学习目的。在生产环境中,需要使用 Bright Data 等顶尖提供商提供的可靠高级代理。

本文稍后将介绍如何获取 Bright Data 代理以及如何在 AIOHTTP 中使用其代理。

HTTP 代理集成

如前文所述,AIOHTTP 支持与 HTTP 代理集成。假设 HTTP 代理的 URL 如下所示:

http://190.6.23.219:999

您可以在 AIOHTTP 请求中使用 proxy 选项进行指定,如下所示:


async with aiohttp.ClientSession() as session:
    async with session.get(
        'https://example.com',
        proxy='http://190.6.23.219:999'
    ) as response:
        print(response.status)

AIOHTTP 可将代理 URL 作为 proxy 参数传递给 get () 函数,然后通过该代理 URL 路由 GET 请求。

请记住,HTTP 和 HTTPS 流量都可使用 HTTP 代理

HTTPS 代理集成

HTTPS 代理的集成较为复杂。如 AIOHTTP 文档中所述:

“在 Python 3.10 中,asyncio 使用的传输层禁用了对 TLS in TLS 的支持。如果下一 Python 版本(即 v3.11)增加属性切换按钮,即有可能开启此功能™。

aiohttp v3.8 及更高版本已为此做好准备,并且已编写相应代码支持 TLS in TLS,因此可以通过 HTTPS 代理隧道发送 HTTPS 请求。”

换言之,如果希望在 AIOHTTP 中使用 HTTPS 代理,需要将 Python 升级至 3.11 版本,将 aiohttp 升级至 v3.8 或更高版本。HTTPS 代理和 AIOHTTP 集成的方法与上述 HTTP 代理和 AIOHTTP 集成的方法一样,唯一的不同在于代理协议为 https,而不是 http

SOCKS 代理集成

AIOHTTP 默认情况下并不支持 SOCKS 代理。如果必须在 AIOHTTP 中使用 SOCKS 代理,必须安装 aiohtpp-socks

pip install aiohttp_socks

该库使用 python-socks 扩展 AIOHTTP,从而支持 SOCKS4(a) 和 SOCKS5(h) 。

假设 SOCKS 代理的 URL 如下所示:

socks5://98.175.31.195:4145

通过以下命令在 AIOHTTP 中使用 SOCKS 代理:


# initialize a SOCKS proxy connector
connector = ProxyConnector.from_url('socks5://98.175.31.195:4145')

# initialize an AIOHTTP client with the SOCKS proxy connector
async with aiohttp.ClientSession(connector=connector) as session:
    async with session.get('https://example.com') as response:
        print(response.status)

AIOHTTP 将通过指定的 SOCKS 代理路由 GET 请求。

ProxyConnector 来自 aiohttp-socks,因此切记使用以下命令进行导入:

from aiohttp_socks import ProxyConnector

在后台,aiohttp-socks 会定义 AIOHTTP 连接器,用于调整请求并通过给定的 SOCKS 代理发送请求。

完整示例

前文介绍了如何在 AIOHTTP 中使用代理。接下来,我们将用完整示例验证上述方法是否有效!

为简单起见,我们将使用 HTTP 代理,但您可以轻松将以下示例中的 HTTP 代理改为 HTTPS 代理和 SOCKS 代理。

GET 请求的目标 URL 是来自 HTTPBin 项目的 /ip 终端。此 API 将返回传入请求的 IP。因此,如果代理集成成功,终端应返回代理服务器的 IP,而不是您本机的 IP。

同样,假设 HTTP 代理服务器的 URL 如下所示:

http://190.6.23.219:999

将该 HTTP 代理服务器集成到 AIOHTTP 中,然后使用以下脚本打印 https://httpbin.io/ip 终端返回的数据:


import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        # perform a GET request through an HTTP proxy
        async with session.get(
          'https://httpbin.io/ip',
          proxy='http://190.6.23.219:999'
        ) as response:
            # extract the response data and print it
            json = await response.json()
            print(json)

asyncio.run(main())

执行此脚本,可得到如下结果:


{
  'origin': '190.6.23.219'
}

果不其然!这正是代理服务器的 IP,意味着 AIOHTTP 代理集成非常完美。

注意:代理服务器的生命周期往往很短暂。在您阅读本教程时,所选代理可能已无法正常运行,上述脚本可能已失效。要确保正常运行,请将 HTTP 代理替换为有效的新代理。

AIOHTPP 代理:高级用例

至此,您已了解 AIOTTP 代理集成的基础知识,但对于更复杂的技术可能还不太清楚。请查阅本章节,详细了解相关内容!

通过环境变量设置全局代理

AIOHTTP 支持通过两种方式确定应使用的代理:

  1. 使用传递给 proxy 参数的代理 URL。
  2. 如果 trust_env 设置为 True,则读取 HTTP_PROXYHTTPS_PROXY 环境变量。

因此,可以在 AIOHTTP 中通过设置以下环境变量全局配置代理:

  • HTTP_PROXY:用于 HTTP 请求的代理服务器的 URL。
  • HTTPS_PROXY:用于 HTTPS 请求的代理服务器的 URL。

例如,在 Linux 或 macOS 上进行设置时可以使用以下命令:


export HTTP_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>@]<HOST>[:<PORT>]"
export HTTPS_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>@]<HOST>[:<PORT>]"

接下来,将 trust_env=True 传递给 aiohttp.ClientSession()

async with aiohttp.ClientSession(trust_env=True) as session:

现可以在没有 proxy 参数的情况下调用 session.get()


async with aiohttp.ClientSession(trust_env=True) as session:
    async with session.get('https://example.com') as response:
        print(response.status)

大功告成!AIOHTTP 将为各项 HTTP 和 HTTPS 请求使用环境变量中指定的代理。

点击链接了解更多信息,cURL 中的代理也适用同样的机制。

代理身份验证方法

在没有相应凭据的情况下试图连接到需要身份验证的代理将导致 407 Proxy Authentication Required 错误。

假设以下字符串为连接到需要身份验证的 HTTP 代理的 URL:

http://admin:[email protected]:8928

其中裸代理 URL 如下所示:

http://20.198.112.312:892

身份验证凭据如下所示:

  • 用户名:admin
  • 密码:pK5ip98NWp56l9sjy

AIOHTTP 支持通过两种方式处理需要身份验证的代理:

  1. 直接在代理 URL 中指定凭据:

async with session.get(
  'https://example.com/',
  proxy='http://admin:[email protected]:8928'
) as response:

2. 将用户名和密码凭据传递给 aiohttp.BasicAuth() 对象,然后将其用于 proxy_auth 选项:


proxy_auth = aiohttp.BasicAuth('admin', 'pK5ip98NWp56l9sjy')
async with session.get(
    'https://example.com/',
    proxy="http://20.198.112.312:892",
    proxy_auth=proxy_auth
) as response:

太棒了!想必您已对 AIOHTTP 代理身份验证有所了解,觉得它不再神秘。

避免 SSL 证书错误

在 AIOHTTP 中设置代理时,以下错误可能会导致请求失败:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain 

为避免这些 SSL 证书问题,请将 ssl 设为 False,关闭 SSL 验证


async with aiohttp.ClientSession() as session:
    async with session.get(
      'https://example.com',
      proxy='http://190.6.23.219:999',
      ssl=False # turn of SSL certificate verification
    ) as response:
        print(response.status)

AIOHTTP SSL 证书验证错误将立即消失。

AIOHTTP 中的轮换代理

如果一再依赖同一代理服务器,目标网站很有可能封锁其 IP 地址。为避免这种情况,必须确保使用不同的代理服务器发送请求。

具体方法如下:

  1. 创建 Python 列表,其中包含许多代理 URL。
  2. 在每次发送请求之前随机选择一个代理 URL。
  3. 在 AIOHTTP 中设置选定的代理 URL。

这种方法的主要问题是会涉及样板代码,还需要访问可靠的代理服务器池,而这并不免费。幸运的是,Bright Data 可以提供更有效的解决方案!我们的轮换代理会自动更改出口 IP 地址,覆盖 195 个国家/地区,具有异常稳定的网络正常运行时间,保证成功率达到 99.9%。

下一章节将介绍如何在 AIOHTTP 中使用 Bright Data 的轮换代理

将 AIOHTTP 与 Bright Data 代理集成

Bright Data 掌控着全球最出色的代理服务器,为财富 500 强企业和 20,000 多家客户提供服务。其全球代理网络包括:

无论是规模还是可靠性,Bright Data 的代理网络都名列前茅。

按照以下步骤操作,了解如何在 AIOHTTP 中使用 Bright Data 的代理。

如果已拥有账户,请登录 Bright Data。如果没有,可以免费创建一个账户。登录之后,即可访问如下所示的用户控制面板:

点击“查看代理产品”(View proxy products) 按钮,如下所示:

查看代理产品

系统将跳转至如下所示的“代理和抓取基础架构”(Proxies & Scraping Infrastructure) 页面:

向下滚动,找到“住宅代理”(Residential Proxies) 卡片,然后点击“开始”(Get started) 按钮:

住宅代理

系统将显示住宅代理配置控制面板。按照向导指南进行操作,根据需要设置代理服务。如果在代理配置过程中有任何疑问,请随时联系我们的支持人员,他们将全天候为您提供服务。

前往“访问参数”(Access parameters) 选项卡,检索代理的主机、端口、用户名和密码,如下所示:

访问参数

请注意,“主机”(Host) 字段已包含端口信息。

以上就是构建代理 URL 并在 AIOHTTP 中使用代理所需的全部信息。整合所有信息,然后使用以下语法构建 URL:

<Username>:<Password>@<Host>

本例中将得到如下 URL:

brd-customer-hl_4hgu8dwd-zone-residential:[email protected]:XXXXX

开启“活动代理”(Active proxy),按照最后的说明进行操作,即可大功告成!

活动代理

AIOHTTP 与 Bright Data 代理集成的代码片段如下所示:


import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        # perform a GET request through an HTTP proxy
        async with session.get(
          'https://lumtest.com/myip.json',
          proxy='http://brd-customer-hl_4hgu8dwd-zone-residential:[email protected]:XXXXX'
        ) as response:
            # extract the response data and print it
            json = await response.json()
            print(json)

asyncio.run(main())

结语

本 AIOHTTP 代理集成教程介绍了为什么要使用代理以及如何在 aiohttp 中设置代理。想必您已了解如何在主流 Python HTTP 客户端库 AIOHTTP 中设置 HTTP、HTTPS 或 SOCKS 代理。如上文所述,只需几行代码即可!

本指南还介绍了为什么不应使用免费代理服务,而应采用信誉良好的代理服务提供商提供的可靠代理服务器。市面上最出色的代理服务器提供商?当属 Bright Data!虽然在 AIOHTTP 中集成代理的过程都一样,但高级代理的优势数不胜数。