切换语言
中文 English Русский Deutsch Español Français Italiano Українська Tiếng Việt Türkçe Bahasa Indonesia हिन्दी 日本語
菜单
价格
代理
代理类型
按地区77 个地区
解决方案
资源

如何在 Python requests 中使用代理

让 requests 通过一个静态 ISP 地址发出请求:一个位于具名互联网服务商网络上的 IP,在您付费的周期内保持不变。下面的代码在发布前已通过需要身份验证的代理实际运行。

简而言之: 传入一个同时包含 http 和 https 两个键的 proxies 字典,两个键都设为 http://USERNAME:PASSWORD@HOST:PORT,requests 就会通过代理发送请求;HTTPS 目标以隧道方式经过代理。如需 SOCKS5,请安装 requests[socks],在订单上把代理切换为 SOCKS5,并使用 socks5h 协议,这样主机名由代理解析,而不是由您的机器解析。

Python requests 从一个字典中读取代理,这个字典把目标 URL 的协议映射到代理 URL。本指南为一个静态 ISP 地址设置这个字典,并展示它可以放在的三个位置:调用中、会话中或环境中。

使用用户名和密码的 Python requests 代理

大多数代理(包括我们的)都要求用户名和密码。requests 从代理 URL 中读取它们,并在每次连接时发送给代理。对于 HTTPS 目标,代理会打开一条隧道,永远看不到请求的内容。代码标签页展示了按请求和按会话两种写法。

在 Python requests 中设置代理

  1. 从订单中复制四个值

    主机、端口、用户名和密码,来自控制台的“我的代理”或 API 中的订单。每个地址都有自己的四个值,没有共享网关。

  2. 拼出一个代理 URL

    http://USERNAME:PASSWORD@HOST:PORT。如果密码包含 /、?、# 或 %,请先用 urllib.parse.quote(password, safe="") 对其进行 URL 编码。

  3. 为两种协议都设置

    把同一个 URL 同时交给 http 键和 https 键。如果只设置了 http,所有 HTTPS 请求都会绕过代理,从您自己的地址发出。

  4. 检查一次出口地址

    请求一个显示调用方 IP 的页面,或通过同一个代理打开“我的 IP 是什么”,确认显示的是您购买的地址。

  5. 带超时运行任务

    务必传入 timeout=:requests 默认会无限等待,连接卡住时脚本看起来就像挂起了。

import requests

# The four values come with your order (dashboard or API)
proxy = "http://USERNAME:PASSWORD@HOST:PORT"

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy, "https": proxy},
    timeout=30,
)
response.raise_for_status()
print(response.status_code)
import requests

proxy = "http://USERNAME:PASSWORD@HOST:PORT"

with requests.Session() as session:
    # HTTP_PROXY / HTTPS_PROXY in the environment would override
    # session.proxies; this makes the session use only its own setting.
    session.trust_env = False
    session.proxies.update({"http": proxy, "https": proxy})
    response = session.get("https://example.com/", timeout=30)
    response.raise_for_status()
    print(response.status_code)
# pip install "requests[socks]"
import requests

# Switch the proxy to SOCKS5 first; use the values the order then shows.
# socks5h: the proxy resolves the hostname, not your machine.
proxy = "socks5h://USERNAME:PASSWORD@HOST:PORT"

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy, "https": proxy},
    timeout=30,
)
response.raise_for_status()
print(response.status_code)

测试过的 requests 代码

每个示例都通过带用户名和密码的 HTTP 代理连接,SOCKS5 示例除外:它需要先把代理切换为 SOCKS5,之后订单会显示新的端口和新的凭据供您使用。请把四处大写内容替换为您订单中的值。

完整 API 文档

requests 中可以设置代理的位置

依据 requests 文档整理,并用本页的代码示例在本地需要身份验证的代理上核对过。同时设置多处时,调用中的 proxies 参数优先于环境变量,环境变量又优先于 Session.proxies,除非会话把 trust_env 设为 False(会话示例就是这样做的)。
作用范围凭据适用场景
调用中的 proxies=仅这一次请求写在 URL 中只有少量调用的脚本
Session.proxies会话中的每个请求写在 URL 中更长的任务,并把 trust_env 设为 False
HTTP_PROXY 和 HTTPS_PROXY进程中的每次 requests 调用写在 URL 中您无法修改的代码;NO_PROXY 列出要跳过的主机
socks5h:// URL取决于它被设置在哪一层写在 URL 中需要由代理解析主机名时

requests 与代理的常见问题

只设置了 http 键

键名指的是目标的协议,而不是代理的协议。只有 http 的字典会让普通 HTTP 走代理,而所有 HTTPS 调用都会直接发出,且没有任何错误提示。

本该用 socks5h 却用了 socks5

使用 socks5 时,由您的机器解析主机名,再把 IP 交给代理。使用 socks5h 时,由代理解析,因此查询及其结果都来自代理的网络,这对按地理位置返回内容的网站很重要。

密码破坏了 URL

密码中的斜杠、问号或井号会把 URL 截断,requests 在连到代理之前就会失败;百分号会被当作转义符解码。请对密码进行 URL 编码,或改用 IP 白名单身份验证,省去凭据。

忘了某个环境变量

除非在会话上把 trust_env 设为 False,requests 会读取 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY,而且这些变量会覆盖 Session.proxies。服务器上残留的旧变量可能把会话的流量发往您未预期的地方,或者绕过代理。

requests 连接的是什么

协议
HTTP(可承载 HTTPS)或 SOCKS5,在订单上切换
认证方式
用户名和密码,或通过 API 设置的 IP 白名单
地址
整个周期内一个静态 IP,位于具名互联网服务商的网络上
轮换
无:每个请求都使用同一个地址

其他指南与产品

关于 Python requests 代理的问题

如何在 Python requests 中使用需要身份验证的代理?

把用户名和密码写进代理 URL,即 http://USERNAME:PASSWORD@HOST:PORT,并同时传给 http 和 https 两个键。requests 会把凭据发送给代理,凭据错误时代理会返回 407。如果密码包含保留字符,请先编码,或改用 IP 白名单。

如何在 requests 中使用 SOCKS5 代理?

用 pip install requests[socks] 安装扩展依赖,在订单上把代理本身切换为 SOCKS5,然后在 socks5h:// URL 中使用订单随后显示的端口和凭据。只改协议名是不够的:设为 HTTP 的地址在切换之前不会响应 SOCKS5。 SOCKS5

可以用 IP 白名单身份验证代替密码吗?

可以。通过一次 API 调用 PUT /orders/ORDER_ID/whitelist,或通过 MCP 服务器,把运行脚本的公网 IPv4 地址加入代理的白名单;控制台目前还没有相应的设置项。之后代理会接受来自该地址的无凭据连接,HTTP 和 SOCKS5 均可,URL 变为 http://HOST:PORT。设置白名单期间,代理只接受列表中的地址,该订单的用户名和密码将不再起作用;发送一个空列表即可关闭白名单,密码登录随即恢复。

地址会在请求之间轮换吗?

不会。静态 ISP 代理在您付费的周期内就是一个地址,您通过它发送的每个请求都从这个地址发出。如果任务需要每个请求换一个地址,那需要的是轮换代理池,我们目前还不销售。

如何查看网站看到的是哪个 IP?

通过同一个代理请求一个回显调用方地址的页面,或在设置了该代理的浏览器中打开“我的 IP 是什么”。如果显示的是您自己的地址,很可能是缺少 https 键。 我的 IP 是什么

代理可以用来做什么?

按地区测试您自己的网站、质量检查、广告验证、价格和市场调研以及品牌保护,按照我们的可接受使用政策无需审核。代理无法绕过验证码、机器人检测、速率限制或账号封禁,政策也禁止尝试这样做。 可接受使用政策

静态地址适合每次都应从同一个地方到达的任务:监控、地区检查、把今天和上周进行比较的测试。在 ISP 代理页面为每个任务订购一个地址,查看价格;如果同样的任务在浏览器中运行,Selenium 和 Playwright 指南会在那里设置同一个地址。

参考来源