1

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)

以下是我的问题:

  1. 为什么我们要传递一个以上的代理get()?如何get()使用它们?它会一一尝试吗?

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

我有这些疑问是因为我对一般代理及其工作方式知之甚少。因此,如果有人也解释这一点,那就太好了。

4

1 回答 1

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

    第二件事是 Requests 目前在通过代理的 HTTPS 方面存在实际问题。一般来说,您应该假设它们不起作用,尽管它实际上比这更复杂一些。

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

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

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

于 2013-07-22T08:01:45.620 回答