了解请求模块中的proxies参数

时间:2013-07-22 07:08:15

标签: python proxy python-requests http-proxy

我在我的脚本中使用requests模块,我想了解proxies方法中的get()参数。 This回答已发布以下代码来说明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)

以下是我的问题:

  1. 为什么我们将多个代理传递给get()get()如何使用它们?它是一个接一个地尝试吗?

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

  3. 如果您想了解更多信息,请written a blog post了解请求中的代理。

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