使用Node.js实时抓取网页

时间:2011-03-06 15:47:58

标签: javascript jquery node.js screen-scraping web-scraping

使用Node.js刮取网站内容有什么好处。我想构建一些非常非常快的东西,它可以以kayak.com的方式执行搜索,其中一个查询被分派到几个不同的站点,结果被删除,并在它们可用时返回给客户端。 / p>

我们假设这个脚本应该只提供JSON格式的结果,我们可以直接在浏览器或其他Web应用程序中处理它们。

一些起点:

Using node.js and jquery to scrape websites

有人有什么想法吗?

8 个答案:

答案 0 :(得分:24)

Node.io似乎拿走了蛋糕: - )

答案 1 :(得分:5)

所有上述解决方案都假设在本地运行刮刀。这意味着您将受到严重的性能限制(由于按顺序或在一组有限的线程中运行它们)。一个更好的方法,imho,是依靠现有的,虽然商业化的刮网。

以下是一个例子:

var bobik = new Bobik("YOUR_AUTH_TOKEN");
bobik.scrape({
  urls: ['amazon.com', 'zynga.com', 'http://finance.google.com/', 'http://shopping.yahoo.com'],
  queries:  ["//th", "//img/@src", "return document.title", "return $('script').length", "#logo", ".logo"]
}, function (scraped_data) {
  if (!scraped_data) {
    console.log("Data is unavailable");
    return;
  }
  var scraped_urls = Object.keys(scraped_data);
  for (var url in scraped_urls)
    console.log("Results from " + url + ": " + scraped_data[scraped_urls[url]]);
});

此处,远程执行抓取,只有在结果准备就绪时才会向您的代码发出回调(还有一个选项可以在结果可用时收集)。

您可以在Bobik client proxy SDK

下载https://github.com/emirkin/bobik_javascript_sdk

答案 2 :(得分:2)

我自己一直在做研究,https://npmjs.org/package/wscraper自称为

  

基于cheerio.js的网络刮刀代理,快速,灵活,精益   核心jQuery的实现;建立在request.js之上;灵感来自   HTTP的agent.js

使用率非常低(根据npmjs.org),但值得一看有兴趣的人士。

答案 3 :(得分:1)

你并不总是需要jQuery。如果您使用从jsdom返回的DOM,例如,您可以轻松地获取您自己需要的内容(也考虑到您不必担心xbrowser问题。)请参阅:https://gist.github.com/1335009根本没有从node.io中删除,只是说你可以自己做,因为......

答案 4 :(得分:1)

使用ES7 / promises的新方法

通常当你在拼抢你想要使用某种方法

  1. 在网络服务器上获取资源(通常是html文档)
  2. 阅读该资源并使用它
    1. DOM /树结构并使其可导航
    2. 将其解析为带有类似SAS的令牌文档。
  3. 树和令牌解析都有优势,但树通常基本上更简单。我们会这样做的。查看request-promise,以下是它的工作原理:

    const rp = require('request-promise');
    const cheerio = require('cheerio'); // Basically jQuery for node.js 
    
    const options = {
        uri: 'http://www.google.com',
        transform: function (body) {
            return cheerio.load(body);
        }
    };
    
    rp(options)
        .then(function ($) {
            // Process html like you would with jQuery... 
        })
        .catch(function (err) {
            // Crawling failed or Cheerio 
    

    这是使用cheerio,它本质上是一个轻量级的服务器端jQuery-esque库(不需要窗口对象或jsdom)。

    因为您正在使用promises,所以您也可以在异步函数中编写它。它看起来是同步的,但它与ES7是异步的:

    async function parseDocument() {
        let $;
        try {
          $ = await rp(options);
        } catch (err) { console.error(err); }
    
        console.log( $('title').text() ); // prints just the text in the <title>
    }
    

答案 5 :(得分:0)

我很容易使用为Node.JS编写的通用剪贴簿https://github.com/harish2704/html-scrapper 它可以根据预定义的模式提取信息。 模式定义包括css选择器和数据提取功能。 它目前使用cheerio进行dom解析..

答案 6 :(得分:0)

结帐https://github.com/rc0x03/node-promise-parser

Fast: uses libxml C bindings
Lightweight: no dependencies like jQuery, cheerio, or jsdom
Clean: promise based interface- no more nested callbacks
Flexible: supports both CSS and XPath selectors

答案 7 :(得分:0)

我看到大多数答案都是cheerio等正确的路径,但是一旦你到达需要来解析和执行JavaScript(ala SPA等等),那么我看看https://github.com/joelgriffith/navalia(我是作者)。 Navalia旨在支持无头浏览器环境中的抓取,而且速度非常快。谢谢!