0

Web サイトを解析するコードの一部が機能しません。

問題を.readurllib2.urlopen オブジェクトの機能までたどることができます。

page = urllib2.urlopen('http://magiccards.info/us/en.html')
data = page.read()

昨日まで、これはうまくいきました。しかし、現在、データの長さは常に 122989 ではなく 69496 ですが、小さなページを開くとコードは正常に動作します。

これを Ubuntu、Linux Mint、および Windows 7 でテストしました。すべて同じ動作をします。

Web サーバーで何かが変更されたと思います。Webブラウザを使用すると、ページは完成します。Wireshark で問題を診断しようとしましたが、ページは完全なものとして受信されます。

なぜこれが起こっているのか、または問題を特定するために何ができるかを誰かが知っていますか?

4

2 に答える 2

4

gzip としてエンコードされたコンテンツを要求しない限り、ページは正しく動作していないようです。これを試してみてください:

import urllib2
import zlib

request = urllib2.Request('http://magiccards.info/us/en.html')
request.add_header('Accept-Encoding', 'gzip')
response = urllib2.urlopen(request)
data = zlib.decompress(response.read(), 16 + zlib.MAX_WBITS)

Nathan が提案したように、デフォルトで gzip を受け入れる優れたRequestsライブラリを使用することもできます。

import requests

data = requests.get('http://magiccards.info/us/en.html').text
于 2012-10-24T15:51:00.587 に答える
0

はい、サーバーが接続を閉じkeep-aliveているため、送信する必要があります。urllib2 にはその機能がありません ( :-( )。以前は、urllib2 オープナーと一緒に動作する HTTPHandler を使用できるurlgrabberがありました。しかし、残念ながら、それも機能しているとは思いません。現時点では、他のライブラリである可能性があります。他の回答またはhttplib2で示されているようなリクエスト。

import httplib2
h = httplib2.Http(".cache")
resp, content = h.request("http://magiccards.info/us/en.html", "GET")
print len(content)
于 2012-10-24T16:00:02.593 に答える