Сканирование ссылок на странице, затем посещение и проверка каждой ссылки с помощью узла и zombie.js

Я пытаюсь создать простую утилиту в Node с zombie.js, чтобы посетить страницу, найти и открыть все ссылки на странице и убедиться, что каждая дочерняя страница возвращает 200 успешно.

Вот пример этого кода (написанный на CoffeeScript), сканирующий домашнюю страницу stackru.com

Browser = require('zombie')

browserOpts =
  runScripts: false
  site: 'http://www.stackru.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 ответ

Извините мой JS на вопрос coffeescript

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

var browserOpts = {
  runScripts: false,
  site: 'http://www.stackru.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

Вы делаете слишком много запросов одновременно, и stackru обрезает вас. Насколько я могу судить, это отсечка 4.

Если вам действительно нужны данные из stackru, используйте api: https://api.stackexchange.com/docs

Другие вопросы по тегам