使用 Node.js 爬行

Posted

技术标签:

【中文标题】使用 Node.js 爬行【英文标题】:Crawling with Node.js 【发布时间】:2011-07-19 02:10:37 【问题描述】:

完整的 Node.js 菜鸟,所以不要评判我...

我有一个简单的要求。爬取网站,查找所有产品页面,并保存产品页面中的一些数据。

说的更简单,做的更简单。

查看 Node.js 示例,我找不到类似的东西。

有一个请求刮刀:

request(uri:'http://www.google.com', function (error, response, body) 
  if (!error && response.statusCode == 200) 
    var window = jsdom.jsdom(body).createWindow();
    jsdom.jQueryify(window, 'path/to/jquery.js', function (window, jquery) 
      // jQuery is now loaded on the jsdom window created from 'body'
      jQuery('.someClass').each(function ()  /* Your custom logic */ );
    );
  
);

但是我不知道如何在它抓取根页面后调用它自己,或者填充它需要抓取的数组或 url。

然后是http代理方式:

var agent = httpAgent.create('www.google.com', ['finance', 'news', 'images']);

agent.addListener('next', function (err, agent) 
  var window = jsdom.jsdom(agent.body).createWindow();
  jsdom.jQueryify(window, 'path/to/jquery.js', function (window, jquery) 
    // jQuery is now loaded on the jsdom window created from 'agent.body'
    jquery('.someClass').each(function ()  /* Your Custom Logic */ );

    agent.next();
  );
);

agent.addListener('stop', function (agent) 
  sys.puts('the agent has stopped');
);

agent.start();

这需要一个位置数组,但话又说回来,一旦你开始使用一个数组,你就不能向它添加更多位置来浏览所有产品页面。

而且我什至无法让 Apricot 工作,由于某种原因我遇到了错误。

那么,我如何修改上述任何示例(或上面未列出的任何内容)以抓取网站、查找所有产品页面、在其中找到一些数据(jquery.someclass 示例应该可以解决问题)以及将其保存到数据库?

谢谢!

【问题讨论】:

Scrape web pages in real time with Node.js的可能重复 【参考方案1】:

就个人而言,我使用 Node IO 来抓取一些网站。 https://github.com/chriso/node.io

有关抓取的更多详细信息可以在wiki 中找到!


【讨论】:

对我来说最好的答案,简单快速 谢谢。我在谷歌上搜索node crawl addon 并通过点击这个问题找到了这个答案。感谢分享。这应该是公认的答案。在过去,我的做法与作者的做法类似,但这太棒了。【参考方案2】:

我在使用Casperjs 爬行和抓取方面取得了相当不错的成功。这是一个建立在Phantomjs 之上的非常好的库。我喜欢它,因为它相当简洁。回调可以作为 foo.then() 执行,这非常容易理解,我什至可以使用 jQuery,因为 Phantomjs 是 webkit 的实现。例如,以下将实例化 Casper 的实例并将存档页面上的所有链接推送到名为“链接”的数组。

var casper = require("casper").create();

var numberOfLinks = 0;
var currentLink = 0;
var links = [];
var buildPage, capture, selectLink, grabContent, writeContent;

casper.start("http://www.yoursitehere.com/page_to/scrape/", function() 
    numberOfLinks = this.evaluate(function() 
        return __utils__.findAll('.nav-selector a').length;
    );
    this.echo(numberOfLinks + " items found");

    // cause jquery makes it easier
    casper.page.injectJs('/PATH/TO/jquery.js');
);


// Capture links
capture = function() 
    links = this.evaluate(function() 
        var link = [];
        jQuery('.nav-selector a').each(function() 
            link.push($(this).attr('href'));
        );
        return link;
    );
    this.then(selectLink);
;

然后,您可以使用 node fs(或其他任何您想要的东西,真的)将您的数据推送到 XML、CSV 或您想要的任何东西。在我构建刮板时,example for scraping BBC photos 非常有用。

这是从 10,000 英尺远的地方看到的 casper 可以做什么。它有一个非常强大和广泛的 API。我挖了它,以防你不知道:)。

我的完整抓取示例在这里:https://gist.github.com/imjared/5201405。

【讨论】:

+1 为 Casperjs。您的回答让我尝试了它,在 3 小时内我完成了很多工作 - 很容易上手。

以上是关于使用 Node.js 爬行的主要内容,如果未能解决你的问题,请参考以下文章

Node.js详解整理:node.js的优势特点优缺点及适用场景,安装及基本使用

仅使用 Node.js 与将 Node.js 与 Apache/Nginx 一起使用

node.js教程基础:node.js命令行选项

Node.js简介

Node.js 模块

Node.js学习四 Node.js回调函数