使用 Node.js 实时抓取网页

问题描述 投票:0回答:9

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

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

一些出发点:

使用node.js和jquery抓取网站

大家有什么想法吗?

javascript jquery node.js screen-scraping web-scraping
9个回答
24
投票

Node.io 似乎占据了蛋糕 :-)


5
投票

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

这是一个例子:

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 客户端代理 SDK


2
投票

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

基于 Cheerio.js 的网络抓取代理,快速、灵活且精益 核心 jQuery 的实现;构建在 request.js 之上;受到启发 http-agent.js

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


1
投票

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


1
投票

使用 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> }



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



0
投票
cheerio

等正确的路径,但是一旦你到达

需要
来解析和执行 JavaScript(ala SPA 等),那么我会查看 https:/ /github.com/joelgriffith/navalia(我是作者)。 Navalia 旨在支持无头浏览器环境中的抓取,而且速度非常快。谢谢!


0
投票
scraper

https://github.com/harish2704/html-scraper 它可以根据预定义的模式提取信息。 模式定义包括 CSS 选择器和数据提取函数。 目前它使用 Cheerio 进行 dom 解析..


0
投票

    “我想构建一个非常非常快的东西,可以执行搜索......到几个不同的站点”。要快速完成任何事情,尤其是多个任务(因为您想抓取多个站点),我建议学习“Nodejs 中的多线程”。也许 DigitalOcean 的这篇文章可以提供帮助:
  1. How to use multithreading in NodeJS

  2. 其次,关于使用 Nodejs 进行抓取。这取决于您想要抓取的网站,如果它们是“静态/服务器渲染”,那么您可以使用 Cheerio 以良好的结构化格式解析 HTML 结果。如果它是一个
  3. javascript-rendered website

    ,那么你必须使用像木偶师这样的东西,它可以像真正的访客一样模拟某些动作。您可以阅读这篇文章,其中重点介绍了

    使用 Puppeteer 与 Cheerio
    在 javascript 中抓取网站之间的差异。希望有帮助!

  4. 我应该提到的另一个技巧是查看网站使用的外部脚本,有时您要查找的数据在那里可用!

我以前从未在 Javascript 上运行过多线程任务,但这似乎很有可能!

© www.soinside.com 2019 - 2024. All rights reserved.