python urllib2:由peer重置连接

时间:2011-05-28 18:48:59

标签: python urllib2

我有一个perl程序,可以从我的大学图书馆的数据库中检索数据并且运行良好。现在我想在python中重写它但遇到问题 <urlopen error [errno 104] connection reset by peer>

perl代码是:

    my $ua = LWP::UserAgent->new;
    $ua->cookie_jar( HTTP::Cookies->new() );
    $ua->timeout(30);
    $ua->env_proxy;
    my $response = $ua->get($url); 

我写的python代码是:

    cj = CookieJar();
    request = urllib2.Request(url); # url: target web page 
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
    opener = urllib2.install_opener(opener);
    data = urllib2.urlopen(request); 

我使用VPN(虚拟专用网络)在家中登录我大学的图书馆,我尝试了perl代码和python代码。 perl代码按我的预期工作,但python代码总是遇到“urlopen错误”。

我用google搜索问题,似乎urllib2无法加载环境代理。但是根据urllib2的文档,urlopen()函数可以透明地使用不需要身份验证的代理。现在我感到很困惑。有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:8)

我尝试伪造用户代理标题,如Uku Loskit和Mikko Ohtamaa所建议,并解决了我的问题。代码如下:

    proxy = "YOUR_PROXY_GOES_HERE"
    proxies = {"http":"http://%s" % proxy}
    headers={'User-agent' : 'Mozilla/5.0'}
    proxy_support = urllib2.ProxyHandler(proxies)
    opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
    urllib2.install_opener(opener)

    req = urllib2.Request(url, None, headers)
    html = urllib2.urlopen(req).read()
    print html

希望它对其他人有用!

答案 1 :(得分:2)

首先,正如史蒂夫所说,你需要response.read(),但这不是你的问题

import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()

您能详细说明错误吗?你可以这样得到它:

try:
    urllib2.urlopen(req)
except URLError, e:
     print e.code
     print e.read()

来源:http://www.voidspace.org.uk/python/articles/urllib2.shtml

(我把它放在评论中,但它吃了我的换行符)

答案 2 :(得分:1)

你可能会发现requests模块是一个更容易使用的urllib2替代品。

答案 3 :(得分:0)

您是否尝试手动指定代理?

proxy = urllib2.ProxyHandler({'http': 'your_proxy_ip'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.uni-database.com')

如果仍然失败,请尝试伪造您的User-Agent标头,以使该请求看起来来自真实的浏览器。