【问题标题】:Scraping Google Dictionary抓取谷歌字典
【发布时间】:2018-02-01 20:33:10
【问题描述】:

我正在尝试抓取 Google 字典并创建一个非官方 API。我尝试使用 Cheerio 和 Node.js 的请求包来实现此功能。

这是我的代码:

var cheerio = require("cheerio");
var request = require('request');

request({
    method: 'GET',
    url: 'https://www.google.co.in/search?q=define+love'
}, function(err, response, body) {

    if(err){
        return console.error(err)
    }


    var $ = cheerio.load(body);

    var a = $(".vk_ans span").text();
    console.log(a);

});

我最初试图废弃这个页面“https://www.google.co.in/search?q=define+love”,我试图废弃写的粗体love,它写在一个类vk_ans的div中。

但是当我console.log 回答时,它会导致一个空行,所有其他地方我都在做同样的事情,而且 Cheerio 工作得很好。我错过了什么?

【问题讨论】:

  • 使用接受的答案解决方案解决了问题,我制作的字典API托管在这里,请随意使用dictionaryapi.herokuapp.com
  • 好久不见,现在 API 每天点击量达到 50k,时间过得真快。
  • API 托管在dictionaryapi.dev,请随意使用。

标签: javascript node.js web-scraping user-agent cheerio


【解决方案1】:

您需要一个用户代理标头才能不被识别为机器人。 试试这个:

var cheerio = require("cheerio");
var request = require('request');

request({
  method: 'GET',
  url: 'https://www.google.co.in/search?q=define+love',
  headers: {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
  }
}, function(err, response, body) {

  if (err) {
    return console.error(err);
  }

  var $ = cheerio.load(body);

  var a = $(".mw").text();
  console.log(a);

});

【讨论】:

  • 非常感谢,它奏效了,虽然我有疑问,当我试图放弃没有用户代理标头时,我虽然无法取消爱定义和所有这些东西,但部分google 说在这么多秒内找到了这么多结果,我可以放弃,为什么会这样?
  • @SurajJain 很可能是因为字典数据是 Javascript 请求的结果,并且只有当用户代理是浏览器时才会在页面中呈现此数据。
  • @SurajJain 您可以通过 Chrome 进行检查,例如将用户代理更改为“Googlebot”(在 Internet 上查看如何执行此操作),您会看到字典内容未呈现。跨度>
  • 实际上字典是渲染的,虽然它不一样,没有css,也不是所有的东西都在那里,所以这就是为什么我可能无法选择它,div id和所有被改变。我说的对吗?
猜你喜欢
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2016-04-22
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多