4

ページにアクセスし、ページ上のすべてのリンクを見つけて開き、各子ページが 200 を正常に返すように、zombie.js を使用して Node で簡単なユーティリティを構築しようとしています。

これは、stackoverflow.com のホームページをクロールするこのコード (CoffeeScript で記述) の例です。

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を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

于 2013-04-12T21:12:39.977 に答える