Bing 検索 API からデータを取得しようとしていますが、既存のライブラリは廃止された古い API に基づいているように見えるため、request
ライブラリを使用してみますが、これは最も一般的なライブラリであると思われます。私のコードは次のようになります
var SKEY = "myKey...." ,
ServiceRootURL = 'https://api.datamarket.azure.com/Bing/Search/v1/Composite';
function getBingData(query, top, skip, cb) {
var params = {
Sources: "'web'",
Query: "'"+query+"'",
'$format': "JSON",
'$top': top, '$skip': skip
},
req = request.get(ServiceRootURL).auth(SKEY, SKEY, false).qs(params);
request(req, cb)
}
getBingData("bookline.hu", 50, 0, someCallbackWhichParsesTheBody)
Bing はいくつかの JSON を返し、私は時々それを操作できますが、応答本文に大量の非 ASCII 文字が含まれている場合JSON.parse
、文字列の形式が正しくないと文句を言います。ATOM コンテンツ タイプに切り替えてみましたが、違いはなく、xml が無効でした。コールバックで利用可能な応答本文を検査すると、request()
実際には悪いコードが示されます。
だから私はいくつかのpythonコードで同じリクエストを試みましたが、それはいつもうまくいくようです. 参考のため:
r = requests.get(
'https://api.datamarket.azure.com/Bing/Search/v1/Composite?Sources=%27web%27&Query=%27sexy%20cosplay%20girls%27&$format=json',
auth=HTTPBasicAuth(SKEY,SKEY))
stuffWithResponse(r.json())
より小さな応答 (結果の数を制限するなど) では問題を再現できず、(オフセットをステップアップすることによって) 問題の原因となる単一の結果を特定することもできません。私の印象では、応答がチャンクで読み取られ、何らかの方法でトランスコードされ、悪い方法で再構築されます。つまり、マルチバイト文字が分割されると、json/atom データが無効になります。これは、大きな応答では発生しますが、小さな応答では発生しません。
ノードを初めて使用するので、何かすべきことがあるかどうかわかりません (エンコーディングをどこかに設定しますか? Bing は UTF-8 を返すので、これは必要ないようです)。
誰が何が起こっているのか知っていますか?
FWIW、私はOSX 10.8を使用しています。ノードはmacports経由でインストールされたv0.8.20であり、リクエストはnpm経由でインストールされたv2.14.0です。