我正在尝试从 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。