10

urllib2の関数を使用urlopenして、StackOverflow API から JSON の結果を取得しようとしています。

私が使用しているコード:

>>> import urllib2
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/")
>>> conn.readline()

私が得ている結果:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ\...

私は urllib にかなり慣れていませんが、これは得られるべき結果とは思えません。他の場所で試してみたところ、期待どおりの結果が得られました (ブラウザーでアドレスにアクセスした場合と同じように、JSON オブジェクトが返されます)。

urlopen他のサイト (例: " http://google.com ") で使用しても問題なく動作し、実際の html が表示されます。私も使用urllibしてみましたが、同じ結果が得られます。

この問題を解決するためにどこを見ればよいかさえわからず、私はかなり行き詰まっています。何か案は?

4

1 に答える 1

10

それはあなたがピクルスに与えるもののようにほとんど見えます. urllib2 が送信している User-Agent 文字列または Accepts ヘッダーの何かが原因で、StackOverflow が JSON 以外のものを送信している可能性があります。

conn.headers.headersContent-Type ヘッダーの内容を確認することは、1 つの証拠となります。

そして、この質問API Call からの Odd String Format Resultに答えがあるかもしれません。基本的に、gzip デコンプレッサを介して結果を実行する必要がある場合があります。

このコードでダブルチェック:

>>> req = urllib2.Request("http://api.stackoverflow.com/0.8/users/",
                          headers={'Accept-Encoding': 'gzip, identity'})
>>> conn = urllib2.urlopen(req)
>>> val = conn.read()
>>> conn.close()
>>> val[0:25]
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ'

はい、間違いなく gzip でエンコードされたデータが返されます。

同じバージョンの Python を使用しているマシンごとに異なる結果が得られているようで、一般的に urllib2 API では gzip でエンコードされたデータを要求するために何か特別なことを行う必要があるように見えるため、そこに透過的なプロキシがあると思います。どこか。

私は 2009 年の CodeCon で EFF のプレゼンテーションを見ました。彼らはエンドツーエンドの接続テストを行って、さまざまな種類の汚い ISP トリックを発見していました。このテスト中に彼らが発見したことの 1 つは、驚くほど多くの消費者レベルの NAT ルーターがランダムな HTTP ヘッダーを追加したり、透過的なプロキシを行ったりしていることです。Accept-Encoding接続を高速に見せるために、ヘッダーを追加または変更する機器がネットワーク上にある場合があります。

于 2010-06-12T11:41:12.503 に答える