我在我的脚本中使用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)
以下是我的问题:
为什么我们将多个代理传递给get()
? get()
如何使用它们?它是一个接一个地尝试吗?
鉴于代理人说a.b.c.d:port
,我怎么知道它的协议类型?当您从hidemyass.com购买高级代理时,它仅以ip:port
格式发送代理,并且不发送协议类型。那么我应该将什么传递给requests.get()
方法?
我有这些怀疑,因为我对代理一般都不太了解,以及它们是如何工作的。如果有人解释这一点,那将会很棒。
答案 0 :(得分:5)
.get()
使用代理,其字典中的键与URL的方案匹配。也就是说,如果您访问“http://www.google.com/”,则会使用其密钥为“http”的代理(在您的示例中为http_proxy
)。如果您访问“https://www.google.com/”,则会使用其密钥为“https”的代理(在您的示例中为https_proxy
)。
简短的回答是,任何付费代理都应接受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版本中得到解决。
如果您想了解更多信息,请written a blog post了解请求中的代理。
至于代理如何工作,它们的目的是接受HTTP请求并将它们转发到目的地。通常它们用于以下两个原因之一:要么改变HTTP请求(并且可能完全丢弃它们),要么缓存HTTP请求/响应。 Wikipedia有一篇很棒的文章可以帮助你入门。