为单个网站选择 Requests 代理
在 Requests 中为一个目标主机名单独指定代理,并理解匹配边界与回退顺序。
某一个网站需要使用与其余 HTTPS 请求不同的代理。Requests 可以直接在代理字典中表达这一选择:
routes = {
"https://reports.example": "http://reports-proxy.example:8080",
"https": "http://default-proxy.example:8080",
}
response = requests.get(
"https://reports.example/monthly",
proxies=routes,
timeout=(5, 20),
)
response.raise_for_status()
对该目标,主机名专用的键会胜出。另一个 HTTPS 主机名会使用作用于整个 scheme 的条目。这些值描述的是代理连接,因此 HTTPS 目标完全可以映射到 HTTP 代理 URL。当这些是无代理账号的获准公开站点路由时,HTTP 代理列表可为这些值提供候选地址;请让每条目标规则都保持明确。
匹配主机名,而不是资源 URL
在 Requests 2.32.5 中,专用键由目标 scheme 与解析后的主机名构成,不包含路径、查询串或端口。
在字典键里加上 /monthly 并不会把规则限制在该路径上。同样,https://reports.example:8443 也不是本选择器能识别的按端口区分的键。即使目标 URL 使用其他端口,这条主机名规则依然生效。
本次查找没有通配符展开。针对 reports.example 的规则不会自动覆盖子域名。当策略需要按路径、端口或后缀匹配时,请在这个简单字典之外做显式路由判断。
搞清楚接下来走哪一层回退
实现按以下顺序检查键:scheme://hostname、scheme、all://hostname,然后是 all。因此,作用于整个 scheme 的 HTTPS 条目优先于适用于所有 scheme 的主机名条目。如果那正是你要的例外,把 scheme 专用的主机名规则放在设计的最前面。
也要考虑 Session 如何合并默认值与来自环境的设置。把这两个显式条目随请求一起传入能让预期路由清晰,但并不会为其他任何目标 scheme 定义策略。
一次重定向可能引入另一个主机名,而代理选择对这个新目标同样相关。请把规则理解为对每个被请求 URL 的判断,而不是绑在第一个页面上的固定路线。