从Google获取定义的最佳方式?

时间:2014-03-17 12:55:31

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

我试图创建一个简单的功能,用户可以指定一个术语,程序为其获取定义并返回它。我所知道的最好的定义系统是Google"定义"搜索查询中的关键字,如果您使用" define"或"定义:"等它返回非常准确和充分的定义。但是,我不知道如何以编程方式访问此信息。

Google的新自定义搜索引擎API不会显示定义,而旧的自定义搜索引擎API会略微提供更好的结果,但已被弃用,但仍然没有显示我在Google中使用该术语时所看到的相同定义浏览器。

谷歌失败了,我转向维基百科,它拥有庞大的API,但我仍然无法找到提取谷歌定义等摘要的方法。

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

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

更新:所以我现在正试图直接从page itself中删除定义。现在的问题是,当我在浏览器(Firefox)中访问该页面时,会显示定义,但是当我使用cheerio抓取它们时,它们不会显示在页面的任何位置。我必须提到我通过nitrous.io抓取页面,以便将页面从不同的区域和操作系统渲染到我在浏览器中查看的页面,这样就可以了#39;与地区有关。将进一步研究。

更新2.0:我想也许这些定义是异步加载的,所以我不知道如何刮掉它们,因为我以前从来没有真正抓过这些定义,而我只是一个新手:(

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

enter image description here

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

enter image description here

有人对此有所了解吗?

1 个答案:

答案 0 :(得分:3)

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

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

                }
            }
        }
    }
});