【问题标题】:Best way to get definitions out of Google?从 Google 获取定义的最佳方式?
【发布时间】:2014-03-19 21:26:24
【问题描述】:

我正在尝试制作一个简单的功能,用户可以在其中指定一个术语,然后程序获取它的定义并返回它。我所知道的最好的定义系统是谷歌在搜索查询中的“定义”关键字,如果你以“定义”或“定义:”等开始查询,它会返回非常准确和充分的定义。但是,我不知道如何以编程方式访问这些信息。

Google 的新自定义搜索引擎 API 不显示定义,旧的 API 提供稍好的结果,但已被弃用,并且仍然不显示我在浏览器中搜索该术语时看到的相同定义。

在 Google 失败后,我求助于 Wikipedia,它有一个庞大的 API,但我仍然找不到像 Google 定义那样提取摘要的方法。

所以我的问题是,有人知道我如何通过 API 或任何其他方式从 Google 获取这些信息吗?

This is an older question 但在问同样的事情。除非给出的答案不再适用,因为 Google 词典不再存在。

更新:所以我现在正在尝试直接从page itself 中删除定义。现在的问题是,当我在浏览器 (Firefox) 中访问页面时,会显示定义,但是当我使用 cheerio 抓取它们时,它们不会显示在页面上的任何位置。我必须提到我正在通过nitrous.io 抓取页面,因此它将页面从不同的区域和操作系统呈现到我在浏览器中查看它的页面,因此它可能与区域相关。将进一步研究。

更新 2.0: 我认为定义可能是异步加载的,所以我不知道如何抓取它们,因为我以前从未真正完成过抓取,而且我只是一个新手 :(

更新 3.0: 好的,所以现在我认为这与异步加载无关,而是与页面的渲染器有关。当我在 Firefox 中加载 this 时,页面如下所示:

但是,当我在 IE (8) 中加载它时,它看起来像这样:

有人对此有所了解吗?

【问题讨论】:

标签: google-api screen-scraping wikipedia google-search


【解决方案1】:

终于找到答案了。屏幕抓取时必须设置用户代理。我通过抓取获取定义的结果代码:

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

var searchTerm = 'test';

request({url:'https://www.google.co.uk/search?q=define+'+searchTerm,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0"}}, function(err, resp, body){
  $ = cheerio.load(body);
    var defineBlocks = $(".lr_dct_sf_sen");
    var numOfBlocks = (defineBlocks.length < 3) ? defineBlocks.length : 3;
    for (var i=0; i<numOfBlocks; i++){
        var block = defineBlocks[i].children[1].children[0]; //font-size:small level
        process(block);

        function process (block) {
            for (var i=0; i<block.children.length; i++){
                var line = block.children[i];
                if ("style" in line.attribs){ // main text
                    exampleStr = "";
                    for (var k=0; k<line.children.length; k++){
                        exampleStr += line.children[k].children[0].data;
                    }
                    console.log(exampleStr);
                } else if ("class" in line.attribs){ // example
                    console.log("\""+line.children[1].children[0].data+"\"");
                } else { // nothing i want

                }
            }
        }
    }
});

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多