オープンデータとプログラミング

Bingの検索APIを使用する(2) “HTTP Error 400: Bad Request”の原因と解決方法は!?

筆者は、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)

Comments are closed.