そこで、Kenneth の優れたrequests モジュールを使用したいと思います。Freebase APIを使おうとしているときに、この問題に遭遇しました。
基本的に、彼らの API は次のようになります。
https://www.googleapis.com/freebase/v1/mqlread?query=...
クエリとして、彼らは JSON オブジェクトを期待します。これは、国とアルコールの割合を含むワインのリストを返すものです:
[{
"country": null,
"name": null,
"percentage_alcohol": null,
"percentage_alcohol>": 0,
"type": "/food/wine"
}]
もちろん、URL に渡す前に、ここから完全にエスケープする必要があるため、実際のクエリは次のようになります。
fullurl = 'https://www.googleapis.com/freebase/v1/mqlread?query=%5B%7B%22percentage_alcohol%3E%22%3A+0%2C+%22country%22%3A+null%2C+%22type%22%3A+%22%2Ffood%2Fwine%22%2C+%22name%22%3A+null%2C+%22percentage_alcohol%22%3A+null%7D%5D'
今、
r = requests.get(fullurl)
print r.status_code
>>> 400
サイトがクエリを解析できなかったと主張しているためです。
r2 = urllib2.urlopen(fullurl)
print r2.getcode()
>>> 200
こちらは問題ありません、ちゃんと返ってきます。興味深いことに、
# This is the url of our requests.get request
print urllib2.urlopen(r.url).getcode()
>>> 200
なんで?モジュールの使い方が間違っていますか?それともバグrequests
ですか?