使用 Node.js 实时抓取网页

IT技术 javascript jquery node.js screen-scraping web-scraping
2021-03-14 16:34:39

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

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

几个出发点:

使用 node.js 和 jquery 抓取网站

有人有任何想法吗?

6个回答

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

Node.io 不再维护。死了,原来的域名被卖了。这个答案不是最新的。
2021-04-22 16:34:39
作为作者,我可以保证 node.io ;)
2021-04-27 16:34:39

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

下面是一个例子:

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

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

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

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

你并不总是需要 jQuery。如果你从jsdom返回例如DOM玩你可以很容易地采取什么样的,你需要看到自己(也考虑到你没有浏览器之间的问题的担心。):https://gist.github.com/1335009这不是从带走根本没有node.io,只是说你可以自己做这取决于......

使用 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-esque 库(不需要窗口对象或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>
}