在页面上抓取链接,然后使用node和zombie.js访问和检查每个链接

时间:2013-03-18 21:04:18

标签: node.js zombie.js

我正在尝试在Node中使用zombie.js构建一个简单的实用程序来访问页面,查找并打开页面上的所有链接,并确保每个子页面成功返回200.

以下是此代码的示例(用CoffeeScript编写),抓取stackoverflow.com的主页

Browser = require('zombie')

browserOpts =
  runScripts: false
  site: 'http://www.stackoverflow.com'

home = new Browser browserOpts

home.visit '/', (e, browser) ->
  questions = browser.queryAll '#question-mini-list .summary h3 a'
  for q in questions
    qUrl = q.getAttribute 'href'
    page = new Browser browserOpts
    page.visit qUrl, (e, browser, statusCode, errors) ->
      console.log "Arrived at page #{browser.window.location} and found " + browser.html().length + " bytes"
      console.log statusCode
      browser.dump()
      return
  return

如果您尝试运行此代码,您会注意到正确加载了第一批链接,并显示了页面中的字节数。

然而,在第一批成功的页面加载(其大小似乎是随机的)之后,所有后续页面加载似乎过早地执行回调到visit。该文档为空(仅为<html><head></head><body></body></html>),回调的statusCode参数为undefined

我无法解释或弄清楚为什么会这样。任何提示将不胜感激。

1 个答案:

答案 0 :(得分:4)

原谅我的js到coffeescript问题

var async = require('async');
var Browser = require('zombie');

var browserOpts = {
  runScripts: false,
  site: 'http://www.stackoverflow.com'
};

var home = new Browser(browserOpts);

home.visit('/', function(e, browser) {
  var questions = browser.queryAll('#question-mini-list .summary h3 a');
  async.eachLimit(questions, 3, function (question, cb) {
    var qUrl = question.getAttribute('href');
    var page = new Browser(browserOpts);
    page.visit(qUrl, function(e, browser, statusCode, errors) {
      console.log(("Arrived at page " + browser.window.location + " and found ") + browser.html().length + " bytes");
      console.log(statusCode);
      browser.dump();
      cb(e);
    });
  }, function (err) {
    console.error('OOPS', err);
  });
});

在这里试试:http://runnable.com/UWh05t96qlJ8AAAC

你一次发出太多请求而stackoverflow正在切断你。据我所知,它的截止时间是4。

如果您真的需要来自stackoverflow的数据,请使用api:https://api.stackexchange.com/docs