Сканирование ссылок на странице, затем посещение и проверка каждой ссылки с помощью узла и 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