【问题标题】:Understanding the proxies parameter in requests module了解请求模块中的代理参数
【发布时间】:2013-07-20 20:17:00
【问题描述】:

我在脚本中使用了requests 模块,我想了解get() 方法中的proxies 参数。 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() 方法呢?

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

【问题讨论】:

    标签: python proxy python-requests http-proxy


    【解决方案1】:
    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 版本中得到解决。

    如果您想了解更多信息,我已经 written a blog post 询问了 Requests 中的代理。

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

    【讨论】:

    • 注意:您可能希望对httphttps 都使用same http:// url。 https:// 代理网址肯定是错误的。 (例如curl 完全采用了http:// 的方案,至少对于httphttps
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多