0

在 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'})

然后根本不使用代理。

我从Proxy with 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)
4

3 回答 3

2

urllib2 ProxyHandler 不是为支持 SOCKS 协议而设计的。也许这个答案会有所帮助。

于 2010-09-16T11:31:49.753 回答
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/')
于 2010-09-16T11:40:58.237 回答
0

更新:我位于中国伟大的防火墙后面。这使问题更加复杂。gfw 既破坏了连接,又造成了 DNS 中毒。

我没有设法让任何 urllib2 解决方案正常工作。但 pycurl 似乎确实有效,它解决了“连接重置”问题。不过 fb/twitter 还是被屏蔽了。

将他们的 IPS 添加到我的主机文件中是可行的 - 因此对于更大规模的解决方案,设置 dns 代理是必要的。

于 2010-09-17T04:28:05.430 回答