筆者は、BING SEARCH APIをPythonで使用しています。
プログラムを書いてみたけど、APIが返してくる“HTTP Error 400: Bad Request”に悩まされたことはありませんか?
分ってしまえば「あー、何だ」といったことなのですが、気づかないと時間ばかり浪費してしまいます。
APIにアクセスすため、urllib2を使います。
以下がエラーが出るサンプルコードです。
import urllib2 #途中省略 baseurl = 'https://api.datamarket.azure.com/Bing/Search/v1/Composite' reqdata['Sources'] = 'web' reqdata['Query'] = 'ほげほげ' params = urllib.urlencode(reqdata) #エンコーディング query_url = baseurl +'?'+params #BASIC認証関係の処理が入るけど省略 f = urllib2.urlopen(query_url) #ここで“HTTP Error 400: Bad Request”
原因
BING SEARCH APIに送信したリクエストに問題があるため、サーバー側がリクエストを処理することができない場合に発生します。
さきほどのソースの場合は、APIに渡すパラメータをシングルクォーテーション(‘)で囲んでいないことが原因です。
BING SEARCH APIでは、シングルクォーテーション(‘)で囲まれていないとエラーになりまs。
プログラム上ではシングルクォーテーション(‘)で囲まれているように見えるので、「囲んだつもり」になってしまいますので要注意です。
解決方法
パラメータの外側をさらに、ダブルクォーテーションで囲んでやれば解決です。
import urllib2 #途中省略 baseurl = 'https://api.datamarket.azure.com/Bing/Search/v1/Composite' reqdata['Sources'] = "'web'" #←さらにダブルクォーテーションで囲みます reqdata['Query'] = "'ほげほげ'" #←さらにダブルクォーテーションで囲みます params = urllib.urlencode(reqdata) #エンコーディング query_url = baseurl +'?'+params #BASIC認証関係の処理が入るけど省略 f = urllib2.urlopen(query_url)