【问题标题】:urllib.urlopen works but urllib2.urlopen doesn'turllib.urlopen 有效,但 urllib2.urlopen 无效
【发布时间】:2010-09-17 02:55:34
【问题描述】:

我正在测试一个简单的网站。它在本地主机上运行,​​我可以在我的网络浏览器中访问它。索引页就是“运行”这个词。 urllib.urlopen 将成功读取页面,但 urllib2.urlopen 不会。这是一个演示问题的脚本(这是实际脚本,而不是不同测试脚本的简化):

import urllib, urllib2
print urllib.urlopen("http://127.0.0.1").read()  # prints "running"
print urllib2.urlopen("http://127.0.0.1").read() # throws an exception

这是堆栈跟踪:

Traceback (most recent call last):
  File "urltest.py", line 5, in <module>
    print urllib2.urlopen("http://127.0.0.1").read()
  File "C:\Python25\lib\urllib2.py", line 121, in urlopen
    return _opener.open(url, data)
  File "C:\Python25\lib\urllib2.py", line 380, in open
    response = meth(req, response)
  File "C:\Python25\lib\urllib2.py", line 491, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python25\lib\urllib2.py", line 412, in error
    result = self._call_chain(*args)
  File "C:\Python25\lib\urllib2.py", line 353, in _call_chain
    result = func(*args)
  File "C:\Python25\lib\urllib2.py", line 575, in http_error_302
    return self.parent.open(new)
  File "C:\Python25\lib\urllib2.py", line 380, in open
    response = meth(req, response)
  File "C:\Python25\lib\urllib2.py", line 491, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python25\lib\urllib2.py", line 418, in error
    return self._call_chain(*args)
  File "C:\Python25\lib\urllib2.py", line 353, in _call_chain
    result = func(*args)
  File "C:\Python25\lib\urllib2.py", line 499, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 504: Gateway Timeout

有什么想法吗?我可能最终需要urllib2 的一些更高级的功能,所以我不想只使用urllib,而且我想了解这个问题。

【问题讨论】:

    标签: python urllib2 urllib


    【解决方案1】:

    先调用 urllib2.open 后调用 urllib.open 是否有相同的结果?只是想知道第一次调用 open 是否会导致 http 服务器忙于超时?

    【讨论】:

    • 不,urllib2无论是否先调用都会报错,而urllib即使被多次调用也不会报错。好主意。
    【解决方案2】:

    听起来您已经定义了 urllib2 正在使用的代理设置。当它尝试代理“127.0.0.01/”时,代理放弃并返回504错误。

    来自Obscure python urllib2 proxy gotcha

    proxy_support = urllib2.ProxyHandler({})
    opener = urllib2.build_opener(proxy_support)
    print opener.open("http://127.0.0.1").read()
    
    # Optional - makes this opener default for urlopen etc.
    urllib2.install_opener(opener)
    print urllib2.urlopen("http://127.0.0.1").read()
    

    【讨论】:

    • 这解决了这个问题,虽然我不知道它是如何或为什么要使用代理的,因为我的脚本只有三行长,而且我没有环境变量可以指示任何代理。不过,很高兴能解决这个问题,所以感谢您的帮助。
    • OpenerDirector 实例没有属性 'urlopen' - 您需要将上述片段更改为 opener.open(...
    【解决方案3】:

    我不知道发生了什么,但您可能会发现这有助于弄清楚:

    >>> import urllib2
    >>> urllib2.urlopen('http://mit.edu').read()[:10]
    '<!DOCTYPE '
    >>> urllib2._opener.handlers[1].set_http_debuglevel(100)
    >>> urllib2.urlopen('http://mit.edu').read()[:10]
    connect: (mit.edu, 80)
    send: 'GET / HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: mit.edu\r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n'
    reply: 'HTTP/1.1 200 OK\r\n'
    header: Date: Tue, 14 Oct 2008 15:52:03 GMT
    header: Server: MIT Web Server Apache/1.3.26 Mark/1.5 (Unix) mod_ssl/2.8.9 OpenSSL/0.9.7c
    header: Last-Modified: Tue, 14 Oct 2008 04:02:15 GMT
    header: ETag: "71d3f96-2895-48f419c7"
    header: Accept-Ranges: bytes
    header: Content-Length: 10389
    header: Connection: close
    header: Content-Type: text/html
    '<!DOCTYPE '
    

    【讨论】:

      【解决方案4】:

      urllib.urlopen() 向服务器抛出以下请求:

      GET / HTTP/1.0
      Host: 127.0.0.1
      User-Agent: Python-urllib/1.17
      

      而 urllib2.urlopen() 抛出这个:

      GET / HTTP/1.1
      Accept-Encoding: identity
      Host: 127.0.0.1
      Connection: close
      User-Agent: Python-urllib/2.5
      

      因此,您的服务器要么不理解 HTTP/1.1,要么不理解额外的标头字段。

      【讨论】:

        猜你喜欢
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-20
        • 2012-08-18
        • 2017-01-08
        • 2012-05-08
        • 2017-03-15
        相关资源
        最近更新 更多