11

私はテストしている簡単なウェブサイトを持っています。これは localhost で実行されており、Web ブラウザーでアクセスできます。インデックス ページは単に「実行中」という単語です。 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、この問題を理解したいと考えています。

4

4 に答える 4

16

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()
于 2008-10-14T15:49:47.223 に答える
1

何が起こっているのかわかりませんが、これを理解するのに役立つかもしれません:

>>> 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 '
于 2008-10-14T15:53:19.510 に答える
1

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 または追加のヘッダー フィールドを理解していません。

于 2008-10-14T15:54:10.460 に答える
1

最初に urlib2.open を呼び出してから urllib.open を呼び出しても同じ結果になりますか? open への最初の呼び出しが原因で http サーバーがビジー状態になり、タイムアウトが発生するのではないかと思っていますか?

于 2008-10-14T15:06:05.237 に答える