集成 · 入门

如何在 Python requests、httpx 和 aiohttp 中使用代理

每个库只需三行配置,随后各处都使用相同的用户名语法:国家/地区、城市和会话都写在代理 URL 中,因此一个网关就能满足所有任务。

阅读约需 3 分钟 6 个章节 审核日期 编辑团队 Proxy Cyber

代理 URL#

每个 Python HTTP 库都以 URL 的形式接收代理。使用 Proxy Cyber 时,凭据和目标定位参数都包含在 URL 的用户名部分;主机名指定网关,端口则决定协议。

代理 URL
# 轮换:每次建立新连接时获得一个新的美国住宅出口
http://USER-cc-us:PASS@res.proxy-cyber.com:9000

# 粘性会话:以 "job42" 为标识,将一个柏林住宅出口保持 30 分钟
http://USER-cc-de-city-berlin-sid-job42-ttl-30m:PASS@res.proxy-cyber.com:9000

# 使用远程 DNS 的 SOCKS5(socks5h),参数相同
socks5h://USER-cc-us:PASS@res.proxy-cyber.com:9001

requests#

连接复用与 IP 分配是不同的机制。客户端会话复用套接字,而轮换与持续会话由实际交付的网关控制。请使用服务中提供的会话参数,并通过多次请求检查出口。关闭连接或发送 Connection: close 并不保证获得另一个 IP。

requests
import requests

PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
proxies = {"http": PROXY, "https": PROXY}

# 一次请求,一个出口
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=30)
print(r.text)

# 粘性流程:此会话的每次请求都使用同一个出口
sticky = "http://USER-cc-de-city-berlin-sid-cart42-ttl-15m:PASS@res.proxy-cyber.com:9000"
s = requests.Session()
s.proxies = {"http": sticky, "https": sticky}
s.get("https://example.com/product/1", timeout=30)
s.post("https://example.com/cart", json={"id": 1}, timeout=30)

httpx#

httpx 接收单个 proxy= 参数(旧版本使用 proxies=)。它支持通过 CONNECT 隧道以 HTTP/2 连接目标,并且在异步代码中的用法相同。

httpx
import httpx

PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"

with httpx.Client(proxy=PROXY, timeout=30) as client:
    print(client.get("https://api.ipify.org").text)

# 异步模式:每个任务使用一个粘性出口
import asyncio

async def fetch(sid: str, url: str) -> str:
    proxy = f"http://USER-cc-us-sid-{sid}-ttl-10m:PASS@res.proxy-cyber.com:9000"
    async with httpx.AsyncClient(proxy=proxy, timeout=30) as client:
        return (await client.get(url)).text

asyncio.run(fetch("task1", "https://api.ipify.org"))

aiohttp#

aiohttp 可按请求或按会话接收代理,并原生支持 HTTP 代理;SOCKS5 则需要 aiohttp-socks 连接器。

aiohttp
import aiohttp, asyncio

PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://api.ipify.org", proxy=PROXY, timeout=aiohttp.ClientTimeout(total=30)) as r:
            print(await r.text())

asyncio.run(main())

轮换、连接保持与重试#

  • 新的 TCP 连接只是新的传输连接,不代表出口必然改变。路由取决于网关为服务配置的轮换模式。
  • 如果交付的网关支持会话标识,请为每个独立流程使用不同标识。允许的持续时间和地区参数应以连接信息为准。住宅设备可能提前离线,因此持续会话不保证数日使用同一 IP。需要固定地址时,应比较独享静态产品。
  • 重试前先判断响应原因。403 可能来自访问规则,更换 IP 不一定有效。遇到 429 时遵守 Retry-After 并降低请求速率;临时网络或服务器故障可采用有限次数的退避重试。会修改数据的操作必须防止重复执行。
  • 根据出口类型设置超时:住宅代理建议连接超时 15 秒、读取超时 45 秒;移动代理应设置得更长。

节省流量#

住宅代理的双向流量都按 GB 计费。请请求压缩响应(这些库默认启用 Accept-Encoding: gzip, br),优先使用 JSON 接口而非 HTML;除非图片、字体或媒体本身就是所需数据,否则不要下载。一个 350 KB 的页面成本很低,而加载资源后达到 4 MB 的页面成本并不低。

大家常问的问题#

为什么 requests 总是获得相同的 IP?

重复 IP 可能来自连接池、持续会话或可用出口池。请检查实际路由模式,并记录多次请求的时间和地址。requests.Session 管理连接与 Cookie,并不自行选择代理出口。

访问 HTTPS 网站需要使用不同的代理吗?

不需要。同一个 http:// 代理 URL 会通过 CONNECT 隧道处理 HTTPS 目标;TLS 在你的代码与目标网站之间保持端到端加密。

同一套代码可以用于移动代理吗?

可以:将 res.proxy-cyber.com 替换为 mob.proxy-cyber.com 即可。端口、凭据和参数完全相同。

您的账户

在一个账户中管理代理服务

在同一控制台比较网络、下单并查看余额与支持请求。团队人工核验付款,交付后提供连接信息。

创建账户