python 2.5中的urllib2.proxyhandler
在Windows XP系统上,我测试了Python 2.5和2.6的以下代码:
import urllib2
proxy= urllib2.ProxyHandler({'http': '127.0.0.1:8080'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com/')
在上面的代码中,我在httplib.py的第349行遇到了一个BadStatusLine异常。
我有一个代理服务器,地址是127.0.0.1:8080,它可以正常工作(我可以通过proxyswitchy设置浏览器使用这个代理,当代理开启时,我可以访问一些在关闭时被屏蔽的网站【在中国】)。
如果我把它改成socks代理,
proxy= urllib2.ProxyHandler({'socks': '127.0.0.1:8080'})
那么这个代理根本就没有被使用。
我从一个问题中得到了这段代码,链接是使用urllib2的代理,这段代码几乎一模一样——那可能出了什么问题呢?
更新:urllib2不支持socks代理。
最后我用curl把它搞定了:
c = pycurl.Curl()
#stupid GFW
if settings.CHINA:
c.setopt(pycurl.PROXY, '127.0.0.1')
c.setopt(pycurl.PROXYPORT, 8087)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
3 个回答
0
假设你本地的代理是一个HTTP代理,而不是socks代理。你可以试试这个:
import urllib2
proxy= urllib2.ProxyHandler({'http': 'http://127.0.0.1:8080/'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com/')
0
更新:我在中国的防火长城后面。这让问题变得更复杂。防火长城不仅断开连接,还进行了DNS污染。
我尝试过的urllib2的解决方案都没有成功。不过,pycurl似乎可以正常工作,并且解决了“连接重置”的问题。不过,Facebook和Twitter还是被封锁了。
把它们的IP地址添加到我的hosts文件里是有效的,所以如果想要一个更大规模的解决方案,就需要设置一个DNS代理。
2
urllib2的ProxyHandler并不支持SOCKS协议。也许这个答案能帮到你。