我正在尝试在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
。
我无法解释或弄清楚为什么会这样。任何提示将不胜感激。
答案 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