【问题标题】:Scrape web pages in real time with Node.js使用 Node.js 实时抓取网页
【发布时间】:2011-07-09 20:23:06
【问题描述】:

使用 Node.js 抓取网站内容的好处是。我想构建一个非常非常快的东西,可以以kayak.com 的风格执行搜索,其中一个查询被分派到几个不同的站点,结果被抓取,并在它们可用时返回给客户端。

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

几个起点:

Using node.js and jquery to scrape websites

有人有什么想法吗?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 作为作者我可以为 node.io 担保 ;)
  • Node.io 不再维护。死了,原来的域名被卖了。这个答案不是最新的。
【解决方案2】:

所有上述解决方案都假定在本地运行刮板。这意味着您的性能将受到严重限制(由于按顺序或在有限的线程集中运行它们)。恕我直言,更好的方法是依靠现有的(尽管是商业的)抓取网格。

这是一个例子:

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]]);
});

在这里,抓取是远程执行的,并且只有在结果准备好时才会向您的代码发出回调(也可以选择在结果可用时收集结果)。

你可以在https://github.com/emirkin/bobik_javascript_sdk下载Bobik client proxy SDK

【讨论】:

    【解决方案3】:

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

    基于cheerio.js 的网络爬虫代理是一种快速、灵活且精简的工具 核心 jQuery 的实现;建立在 request.js 之上;灵感来自 http-agent.js

    使用率非常低(根据 npmjs.org),但值得任何感兴趣的人看看。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        使用 ES7/promises 的新方式

        通常当你在抓取时,你想使用一些方法来

        1. 获取网络服务器上的资源(通常是html文档)
        2. 读取该资源并将其用作
          1. DOM/树结构并使其可导航
          2. 使用 SAS 之类的东西将其解析为令牌文档。

        树和令牌解析都有优势,但树通常要简单得多。我们会这样做的。查看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 类库(不需要窗口对象或 jsdom)。

        因为您使用的是 Promise,所以您也可以将其写在异步函数中。它看起来是同步的,但它与 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>
        }
        

        【讨论】:

          【解决方案6】:

          查看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】:

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

            【讨论】:

              【解决方案8】:

              这是我的易于使用但拼写错误的通用 scraper https://github.com/harish2704/html-scraper 为 Node.JS 编写 它可以根据预定义的模式提取信息。 模式定义包括一个 css 选择器和一个数据提取功能。 它目前使用cheerio 进行dom 解析..

              【讨论】:

                猜你喜欢
                • 2017-06-23
                • 2019-04-29
                • 1970-01-01
                • 2017-08-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-18
                相关资源
                最近更新 更多