用Node.js实时刮取网页

什么是一个好的是用Node.js刮取网站内容。 我想创build一个非常非常快速的东西,可以执行kayak.com样式的search ,其中一个查询分派到几个不同的站点,结果被删除 ,并在客户端可用时返回给客户端。

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

几个起点:

使用node.js和jquery来抓取网站

任何人有任何想法?

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

上述所有的解决scheme都假定在本地运行刮刀。 这意味着你的performance会受到严重的限制(由于它们按顺序或者在一组有限的线程中运行)。 一个更好的方法是,依靠现有的,尽pipe商业,刮网。

这里是一个例子:

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

在这里,抓取是远程执行的,只有在结果准备就绪后才会向您的代码发出callback(也可以在结果可用时收集结果)。

您可以在https://github.com/emirkin/bobik_javascript_sdk下载Bobik客户端代理SDK

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

一个基于cheerio.js的web刮板代理,是一个快速,灵活和精益的jQuery核心实现; build立在request.js之上; 受http-agent.js启发

非常低的使用率(根据npmjs.org),但值得一看感兴趣的各方。

你并不总是需要jQuery。 如果你玩从jsdom返回的DOM,例如你可以很容易地采取自己需要的东西(也考虑到你不必担心xbrowser的问题。)请参阅: https ://gist.github.com/1335009这不是带走node.io在所有,只是说你可以自己做,取决于…

使用ES7 / promise的新方法

通常当你在刮,你想用一些方法来

  1. 获取networking服务器上的资源(通常是html文件)
  2. 阅读该资源,并将其作为
    1. DOM /树结构并使其可导航
    2. 使用SAS之类的东西将其parsing为标记文档。

树和标记分析都有优势,但树通常要简单得多。 我们会这样做。 退房请求 – 承诺 ,这是它是如何工作的:

 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)。

因为你使用的是承诺,所以你也可以用asynchronous函数来写。 它看起来是同步的,但它会与ES7asynchronous:

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

这是我很容易使用通用刮板https://github.com/harish2704/html-scrapper为Node.JS编写它可以提取基于预定义模式的信息。; 模式定义包括一个CSSselect器和一个数据提取function。 它目前正在使用cheerio进行domparsing。

检查出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 

我看到大多数答案都是正确的path,但是一旦你到了需要parsing和执行JavaScript(ala SPA等等)的地步,那么我会查看https://github.com/joelgriffith / navalia (我是作者)。 Navalia的构build是为了支持在无头浏览器环境中进行search,而且非常快。 谢谢!