Python - 如何通过 HTTP 代理使用(Urllib2 + SSL)处理 HTTPS 请求

Sha*_*Ing 5 python proxy python-2.7

我正在尝试使用 urllib2.ProxyHandler 测试代理连接。但是,在某些情况下,我可能会请求一个 HTTPS 网站(例如:https : //www.whatismyip.com/

如果请求 HTTPS 站点,Urllib2.urlopen() 将抛出 ERROR。所以我尝试使用一个辅助函数来重写 URLOPEN 方法。

这是辅助函数:

def urlopen(url, timeout):
    if hasattr(ssl, 'SSLContext'):
        SslContext = ssl.create_default_context()
        SslContext.check_hostname = False
        SslContext.verify_mode = ssl.CERT_NONE
        return urllib2.urlopen(url, timeout=timeout, context=SslContext)
    else:
        return urllib2.urlopen(url, timeout=timeout)
Run Code Online (Sandbox Code Playgroud)

这个基于答案的辅助函数

然后我使用:

urllib2.install_opener(
     urllib2.build_opener(
         urllib2.ProxyHandler({'http': '127.0.0.1:8080'})
     )
)
Run Code Online (Sandbox Code Playgroud)

为 urllib.opener 设置 http 代理。

理想情况下,当我通过使用请求网站时,它应该可以工作,urlopen('http://whatismyip.com', 30)并且应该通过 http 代理传递所有流量。

但是,即使是HTTP站点,urlopen()也会一直陷进去if hasattr(ssl, 'SSLContext')。此外,HTTPS 站点也没有使用 HTTP 代理。这会导致 HTTP 代理无效并且所有流量都通过未经代理的网络

我也尝试过这个答案将 HTTP 更改为 HTTPS,urllib2.ProxyHandler({'https': '127.0.0.1:8080'})但它仍然无法正常工作。

我的代理正在工作。如果我使用urllib2.urlopen()而不是重写版本urlopen(),它适用于 HTTP 站点。

但是,如果urlopen需要在仅 HTTPS 的站点上使用,我确实需要考虑是否适合。

怎么做?

谢谢

UPDATE1:我无法使用 Python 2.7.11 和某些服务器正常使用 Python 2.7.5 进行这项工作。我认为这是python版本问题。

Urllib2 不会通过 HTTPS 代理,因此所有 HTTPS 网址都将无法使用代理。

Cor*_*hay 1

我个人建议使用诸如此类的东西,因为python-requests它可以缓解直接使用设置代理的许多问题urllib2。使用requests代理时,您必须执行以下操作:(来自他们的文档

import requests

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('http://example.org', proxies=proxies)
Run Code Online (Sandbox Code Playgroud)

禁用 SSL 证书验证就像传递上面的命令一样verify=False简单requests.get。但是,应该谨慎使用,并且 SSL 证书验证的实际问题应该得到解决。