Glo*_*omy 5 javascript asynchronous node.js 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;
}
Run Code Online (Sandbox Code Playgroud)
我知道这段代码在很多层面上都是错误的,但它应该让您了解我正在尝试做什么。
我应该如何修改它才能使其正常工作?(如果可能的话,不使用承诺)
(您可以假设该网站具有树状结构,因此每个页面仅具有指向三个页面下方页面的链接,因此采用递归方法)
我知道您无论出于何种原因都不愿意使用承诺(我不能在评论中询问为什么,因为我是新人),但我相信承诺是实现这一目标的最佳方式。
这是一个使用承诺的解决方案,可以回答您的问题,但可能不完全是您所需要的:
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
});
Run Code Online (Sandbox Code Playgroud)
编辑:感谢 Bergi 的评论,重写了代码以避免 Promise 构造函数反模式。
编辑:以更好的方式重写。通过使用 Bluebird 的concurrency选项,您可以轻松限制同时连接的数量。
| 归档时间: |
|
| 查看次数: |
1927 次 |
| 最近记录: |