【问题标题】:Crawling links on a page, then visiting and inspecting each link with node and zombie.js抓取页面上的链接,然后使用 node 和zombie.js 访问和检查每个链接
【发布时间】:2013-04-13 05:12:39
【问题描述】:

我正在尝试使用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

我无法解释或弄清楚为什么会发生这种情况。任何提示将不胜感激。

【问题讨论】:

    标签: node.js zombie.js


    【解决方案1】:

    请问我的 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

    【讨论】:

    • 您好,感谢您的回复!该问题使用抓取 stackoverflow.com 来演示用法,但我的初衷是完全抓取另一个站点(www.totsy.com 上的销售),而不是实际抓取 stackoverflow 主页。我不认为他们在节流,因为我在爬 totsy.com 时遇到了同样的行为。但是,此解决方案似乎确实有效。我在想通过限制请求,你正在防止某种竞争条件。最终,我怀疑这里存在更深层次的问题。
    • 是的,3 的截止限制可能正是僵尸一次可以处理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2015-04-20
    • 2021-11-27
    相关资源
    最近更新 更多