你的代理文件是池,而不是 Requests 路由表
把一条带认证的代理列表记录转换成选定的出口,而不要把代理地址当作目标路由的键。
先从文件中选定一个代理,再为网站请求构建路由映射。候选出口的池本身并不是 Requests 的路由字典。
- 按既定格式解析这条记录。 非正式的
IP:port:user:password行在 IPv6 地址或凭据含冒号时会有歧义。对于 IPv4 主机、数字端口和不含冒号的用户名,限定切分可以把剩余文本留作密码。这些限制不适用时,请使用独立的结构化字段。 - 为本次操作选定出口。 保留它真实的协议,并在构建其 URL 时对凭据各部分进行编码。不要把这个含密值写进常规日志。
- 把目标协议映射到那个选定的 URL。 对选定的一个 HTTP 代理来说,映射可以是这样:
routes = {
'http': selected_proxy_url,
'https': selected_proxy_url,
}http 和 https 这两个键选择的是目标协议。像 http://203.0.113.10 这样的键选的则是发往该确切目标主机的请求;它并不标记该地址上的代理。把每个代理 IP 都当作键,可能让无关网站失去原本的路径。
把池解析一次,选定一个出口,再为客户端调用创建映射。把这些步骤分开,就能在改变选择策略时不改变 Requests 路由键的含义。