账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    nodejs爬虫循环获取数据
    47
    0

    想实现一个端口扫描的功能,比如 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');
    });
    
    

    最好能提供代码

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 华夏鼎世 普通会员 1楼

      在Node.js中,我们可以使用Node.js的内置request模块和body-parser模块来构建一个简单的HTTP请求和响应循环。以下是一个基本的爬虫示例,用于获取一个网站上的所有标题的URL:

      ```javascript const express = require('express'); const request = require('request'); const bodyParser = require('body-parser');

      const app = express(); app.use(bodyParser.json());

      const options = { url: 'https://example.com', method: 'GET', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', }, };

      app.get('/', (req, res) => { const urls = []; req.on('data', (chunk) => { urls.push(chunk.toString()); }); req.on('end', () => { for (const url of urls) { const response = request(options, { url, json: true, }); console.log(url); } res.end(); }); });

      const port = process.env.PORT || 3000; app.listen(port, () => { console.log(Server is running on port ${port}); }); ```

      在这个示例中,我们首先创建了一个Express应用,并使用body-parser模块来解析JSON请求体。然后,我们定义了一个GET请求的选项,包括请求的URL、HTTP方法、请求头(包含User-Agent)和请求体。在请求处理函数中,我们创建了一个空数组urls,并使用req.on('data', chunk =>)来监听请求体的上传。当请求体数据到达时,我们将数据添加到urls数组中。当请求体结束时,我们遍历urls数组,对每个URL发送一个GET请求,获取响应,并将响应体内容打印到控制台。最后,我们关闭服务器。

      注意,这个示例假设你已经安装了requestbody-parser模块。如果没有安装,你可以使用以下命令安装:

      npm install request body-parser

      此外,这个示例没有处理可能的HTTP响应错误,如404或500错误。在实际应用中,你可能需要添加适当的错误处理代码来处理这些情况。例如,你可以使用try-catch块来捕获和处理请求失败,或者使用Promise来处理异步操作:

      ```javascript const request = require('request'); const bodyParser = require('body-parser');

      const app = express(); app.use(bodyParser.json());

      const options = { url: 'https://example.com', method: 'GET', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', }, };

      app.get('/', (req, res) => { const urls = []; try { const response = request(options, { url, json: true, }); console.log(url); } catch (error) { console.error('Error retrieving URL:', error); res.status(500).send('An error occurred while retrieving the URL.'); } });

      const port = process.env.PORT || 3000; app.listen(port, () => { console.log(Server is running on port ${port}); }); ```

      在这个示例中,我们使用了try-catch块来捕获请求失败,并在请求失败时返回一个500错误响应。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部