【发布时间】:2016-07-05 12:30:47
【问题描述】:
我正在尝试使用 urllib2.ProxyHandler 测试代理连接。但是,在某些情况下,我可能会请求一个 HTTPS 网站(例如:https://www.whatismyip.com/)
如果请求 HTTPS 站点,Urllib2.urlopen() 将抛出错误。所以我尝试使用辅助函数来重写 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)
这个辅助函数基于answer
然后我使用:
urllib2.install_opener(
urllib2.build_opener(
urllib2.ProxyHandler({'http': '127.0.0.1:8080'})
)
)
为 urllib.opener 设置 http 代理。
理想情况下,当我使用 urlopen('http://whatismyip.com', 30) 请求网站时它应该可以工作,并且它应该通过 http 代理传递所有流量。
但是,urlopen() 会一直落入if hasattr(ssl, 'SSLContext'),即使它是一个 HTTP 站点。此外,HTTPS 站点也没有使用 HTTP 代理。这会导致 HTTP 代理失效,所有流量都通过未代理的网络
我也试过这个 answer 将 HTTP 更改为 HTTPS urllib2.ProxyHandler({'https': '127.0.0.1:8080'}),但它仍然无法正常工作。
我的代理正在工作。如果我使用urllib2.urlopen() 而不是重写版本urlopen(),它适用于HTTP 站点。
但是,如果 urlopen 需要在仅限 HTTPS 的站点上使用,我确实需要考虑适合性。
怎么做?
谢谢
更新 1: 我无法在 Python 2.7.11 上完成这项工作,而某些服务器在 Python 2.7.5 上也能正常工作。我认为这是python版本问题。
Urllib2 不会通过 HTTPS 代理,因此所有 HTTPS 网址都将无法使用代理。
【问题讨论】:
标签: python python-2.7 proxy