【问题标题】:Scraping Google Translate抓取谷歌翻译
【发布时间】:2014-01-13 20:02:18
【问题描述】:

我想用 NodeJS 和 Cheerio 库抓取 Google 翻译:

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 秒,直到 Google 创建了所有跨度元素,但不......似乎不是......

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

【问题讨论】:

标签: node.js web-scraping cheerio


【解决方案1】:

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

或者至少对我来说,它总是只使用类标识符(如果存在)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2015-05-19
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多