4

我想用 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 id="result_box">
    <span class="hps">hello</span>
    <span class="hps">world</span>
</span>

所以我想我可以等待 5-10 秒,直到谷歌创建了所有跨度元素,但没有.. 似乎不是..

setTimeout(function() {
        $ = cheerio.load(body);
        console.log($('#result_box').find('span').length);    
    }, 15000);

请问你能帮帮我吗?:)


解决方案:

我使用 http.get 而不是cheerio:

http.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 是对服务器的请求。

4

2 回答 2

0

我知道你已经解决了这个问题,但我认为你的代码不起作用的原因是你应该写 [...].find("span.hps").[...]

或者至少对我来说,它总是只与类标识符一起工作,如果存在的话。

于 2018-05-14T12:46:33.720 回答
0

你不能在节点中使用cheerio来抓取谷歌翻译的原因是谷歌没有在谷歌端渲染翻译页面!他们用脚本回复您的请求,然后脚本发出一个包含您的字符串的 api 请求。然后用户端的脚本再次运行并构建您看到的内容,这就是在cheerio 中不会发生的事情!

所以你需要向 api 发出请求,但它是谷歌,他们可以检测到抓取,所以他们会在几次尝试后阻止你!

您仍然可以伪造用户行为,但这需要很长时间,而且他们可能随时阻止您!

于 2018-12-29T18:29:12.740 回答