【问题标题】:python urllib2: connection reset by peerpython urllib2:对等方重置连接
【发布时间】:2011-05-28 18:48:58
【问题描述】:

我有一个 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 错误”。

我搜索了这个问题,似乎 urllib2 无法加载环境代理。但是根据 urllib2 的文档,urlopen() 函数可以透明地与不需要身份验证的代理一起工作。现在我感觉很混乱。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 在 Python 中跳过分号。他们不会受伤,但他们是糟糕的形式。此外,在您执行 urllib.urlopen(request).read() 之前,您实际上不会获得任何数据

标签: python urllib2


【解决方案1】:

我尝试按照 Uku Loskit 和 Mikko Ohtamaa 的建议伪造 User-Agent 标头,并解决了我的问题。代码如下:

    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

希望对其他人有用!

【讨论】:

    【解决方案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

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

    【讨论】:

      【解决方案3】:

      您可能会发现requests 模块是 urllib2 的更易于使用的替代品。

      【讨论】:

      • 对于任何使用请求模块的人,this site 给出了一个示例(向下滚动)。
      【解决方案4】:

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

      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 标头,以使请求看起来像是来自真实的浏览器。

      【讨论】:

      • 伪造用户代理标头解决了我的问题。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2016-03-03
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      相关资源
      最近更新 更多