python 2.5中的urllib2.proxyhandler

0 投票
3 回答
3850 浏览
提问于 2025-04-16 04:13

在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协议。也许这个答案能帮到你。

撰写回答