了解请求模块中的proxies参数

Naw*_*waz 1 python proxy http-proxy python-requests

requests在我的脚本中使用模块,我想了解方法中的proxies参数get().这个答案已经发布了以下代码来说明proxies参数的用法:

http_proxy  = "10.10.1.10:3128"
https_proxy = "10.10.1.11:1080"
ftp_proxy   = "10.10.1.10:3128"

proxyDict = {"http":http_proxy,  "https":https_proxy, "ftp":ftp_proxy }

r = requests.get(url, headers=headers, proxies=proxyDict)
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 为什么我们传递多个代理get()?怎么get()用它们?它一个接一个地尝试吗?

  2. 有代理人说,a.b.c.d:port我怎么知道它的协议类型?当您从hidemyass.com购买高级代理时,它ip:port仅以格式发送代理,并且不发送协议类型.那么我应该传递给requests.get()方法呢?

我有这些疑虑,因为我对代理一般都不太了解,以及它们是如何工作的.如果有人解释这一点,那将会很棒.

Luk*_*asa 5

  1. .get()使用其字典中的键与URL的方案匹配的代理.也就是说,如果您访问" http://www.google.com/ ",则会使用其密钥为"http"的代理(在您的示例中http_proxy).如果您访问" https://www.google.com/ ",则会使用其密钥为"https"的代理(在您的示例中https_proxy).

  2. 简短的回答是任何付费代理都应接受HTTP和HTTPS URL.

    在实践中,Requests使这变得复杂,它做了两件意想不到的事情.首先,如果您使用您在问题中提供的表单中的代理地址(即ip:port),请求将假定用于访问代理的协议与您代理的协议相同.也就是说,http_proxy将在内部转换为"http://10.10.1.10:3128",和https_proxy"https://10.10.1.11:1080".这通常不是您想要的,因此您应该始终明确并使用表单scheme://ip:port.

    第二件事是请求当前通过代理存在HTTPS的实际问题.一般来说,你应该假设它们不起作用,虽然它实际上比这复杂一点.

    这两个问题都可能在计划的V2.0版本中得到解决.

如果您想了解更多信息,我已在Requests中撰写了一篇关于代理的博文.

至于代理如何工作,他们的目的是接受HTTP请求并将它们转发到目的地.通常它们用于以下两个原因之一:要么改变HTTP请求(并且可能完全丢弃它们),要么缓存HTTP请求/响应.维基百科有一篇很棒的文章可以帮助您入门.