nodejs爬虫循环获取数据

a2774206
  • 1.5k

想实现一个端口扫描的功能,比如 192.168.1.666:80 -192.168.1.666:10000

使用的是 nodejs + express + cheerio

个人思路:循环端口,使用superagent抓取80-10000之间ip的端口,如果该端口没有则跳出本次循环,然后执行下次,声明data变量,如果端口内有内容且抓网站title,pushdata中,
最后当执行到最大接口时,res.send(data)

遇到的问题:一直在转圈圈,把循环调小也一样,不知道什么问题,需要异步还是代码有问题?

代码:

const express = require('express');
var cheerio = require('cheerio');
const superagent = require('superagent');
const app = express();

//爬取地址

var url = 'http://47.74.xxx.xxx';
var maxport = 8085;
var data = [];
for(let port = 8082; port < maxport ; port++){
    app.get('/', function (req, res, next) {
    superagent.get( url + ':' + port )
        .end(function (err, sres) {
            if (err) {
                return next(err);
            }
            const $ = cheerio.load(sres.text);
            let items = $('title').text();
            data.push(items)
            
            if(port >= maxport){
                res.send(data);
            }
            
    
        })
    });
}

app.listen(3000, function () {
    console.log('app is listening at port 3000');
});

最好能提供代码

回复
阅读 2.4k
1 个回答
const EventProxy = require('eventproxy');
const ep = new EventProxy();
let maxPort = 10000;
let portList = [];
let data = [];
const url = xxx.xxx.xxx.xx;
for(let port = 8082; port < maxPort; port ++) {
    portList.push(port);
}

portList.forEach((port) => {
    superagent.get( url + ':' + port )
    .end(function (err, sres) {
        if (err) {
            return ;
        }
        ep.emit('port', sres); //注册事件
    });
    
})

ep.after('port', maxPort - port, function(ports) {
    data = ports.map((item) => {
        const $ = cheerio.load(item.text);
        let title = $('title').text();
        return title;
    });
    console.log(data);
})

app.get('/', function(req,res, next) {
    res.send(...)
});

你的问题可以归结为在nodejs中,for循环里面如何异步处理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏