4

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

我无法解释或弄清楚为什么会这样。任何提示将非常感谢。

4

1 回答 1

4

请原谅我的 js 一个咖啡脚本问题

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

于 2013-04-12T21:12:39.977 回答