我想用NodeJS和cheerio库抓取谷歌翻译:
request("http://translate.google.de/#de/en/hallo%20welt", function(err, resp, body) {
if(err) throw err;
$ = cheerio.load(body);
console.log($('#result_box').find('span').length);
}
但他无法从翻译框(result_box)中找到必要的span-elements。在网站的源代码中,它看起来像这样:
<span id="result_box">
<span class="hps">hello</span>
<span class="hps">world</span>
</span>
所以我想我可以等待5-10秒,直到谷歌创建了所有的span-elements,但是没有......似乎不是......
setTimeout(function() {
$ = cheerio.load(body);
console.log($('#result_box').find('span').length);
}, 15000);
你能帮助我吗? :)
解决方案:
我使用http.get:
而不是cheeriohttp.get(
this.prepareURL("http://translate.google.de/translate_a/t?client=t&sl=de&tl=en&hl=de&ie=UTF-8&oe=UTF-8&oc=2&otf=1&ssel=5&tsel=5&pc=1&q=Hallo",
function(result) {
result.setEncoding('utf8');
result.on("data", function(chunk) {
console.log(chunk);
});
}));
所以我得到一个带翻译的结果字符串。使用过的url是对服务器的请求。
答案 0 :(得分:0)
我知道你已经解决了这个问题,但我认为你的代码无效的原因是因为你应该写[...]。find(“span.hps”)。[...]
或者至少对我来说,它总是只用于类标识符,如果存在的话。
答案 1 :(得分:0)
您无法在节点中使用cheerio来取消Google翻译的原因是Google未在Google端渲染翻译页面! 他们用脚本答复您的请求,然后脚本发出一个包含您的字符串的api请求。然后,用户端的脚本再次运行并构建您看到的内容,而这在cheerio中是不会发生的!
因此,您需要向api发出请求,但它是Google,他们可以检测到报废,因此在尝试几次后它们将阻止您!
您仍然可以伪造用户的行为,但这将花费很长时间,并且它们可能随时阻止您!