javascript - 如何使用 javascript 制作递归爬虫?

标签 javascript node.js asynchronous web-scraping

所以我正在制作一个用于学习目的的小爬虫,最后我应该得到网站上页面的树状结构。

我一直在努力争取正确的请求。这或多或少是我所拥有的:

var request = require('request');


function scanPage(url) {

  // request the page at given url:


  request.get(url, function(err, res, body) {

    var pageObject = {};

    /* [... Jquery mumbo-jumbo to

        1. Fill the page object with information and
        2. Get the links on that page and store them into arrayOfLinks 

    */

    var arrayOfLinks = ['url1', 'url2', 'url3'];

    for (var i = 0; i < arrayOfLinks.length; i++) {

      pageObj[arrayOfLinks[i]] = scanPage[arrayOfLinks[i]];

    }
  });

    return pageObj;
}

我知道这段代码在很多层面上都是错误的,但它应该让您了解我正在尝试做什么。

我应该如何修改它才能使其工作? (如果可能,不使用 promise )

(您可以假设该网站具有树状结构,因此每个页面都只链接到三个页面下方的页面,因此采用递归方法)

最佳答案

我知道无论出于何种原因您都不想使用 promises(我不能在评论中问为什么,因为我是新手),但我相信 promises 是实现这一目标的最佳方式。

这是一个使用 promises 的解决方案,可以回答您的问题,但可能不是您所需要的:

var request = require('request');
var Promise = require('bluebird');
var get = Promise.promisify(request.get);

var maxConnections = 1; // maximum number of concurrent connections

function scanPage(url) {

    // request the page at given url:

    return get(url).then((res) => {

        var body = res.body;

        /* [... Jquery mumbo-jumbo to

        1. Fill the page object with information and
        2. Get the links on that page and store them into arrayOfLinks

        */

        var arrayOfLinks = ['url1', 'url2', 'url3'];

        return Promise.map(arrayOfLinks, scanPage, { concurrency: maxConnections })
                            .then(results => {
                                var res = {};
                                for (var i = 0; i < results.length; i++)
                                    res[arrayOfLinks[i]] = results[i];
                                return res;
                            });

    });

}

scanPage("http://example.com/").then((res) => {
    // do whatever with res
});

编辑:感谢 Bergi 的评论,重写了代码以避免 Promise 构造函数反模式。

编辑:以更好的方式重写。通过使用 Bluebird 的 concurrency 选项,您可以轻松地限制同时连接的数量。

关于javascript - 如何使用 javascript 制作递归爬虫?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37546141/

相关文章:

javascript - 在 Redux 中将多个操作传递给 mapDispatchToProps

javascript - NodeJS - 是否可以有两个独立的集群?

c# - 任务完成源 : When to use SetResult() versus TrySetResult(), 等

c - gwan是如何实现异步 Action 的?

php - 显示上传的图像

javascript - 拆分命令中的正斜杠

node.js - 默认情况下,哪些客户端可以/不能访问 RESTful Web 服务?

javascript - MEAN.JS 无法连接 MongoDB

python 异步特殊类方法 __delete__

javascript - es6 类方法无法到达此实例