简单的Node爬虫

写在开头

经过一个漫长的寒假,终于也是赶上复工的潮流。祝贺全国人民抗"疫"取得阶段性的胜利。
在平常的Node使用过程中,我主要就是爬取点东西。今天分享一个简单的Node爬虫程序。抓取某培训站点的评论内容。

1.引入依赖文件

const https = require('https'),  //发送请求
fs = require('fs'),      // fs文件操作
cheerio = require('cheerio'); // 类似于jQuery

2.定义类

class crawlData {
    constructor(page) {
        this.currentPage = 1;
        this.page = page;
        this.baseUrl = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // 因为涉及侵权,就不挂链接了。
        this.init();
    }
}

3.定义Init()函数

/*
 * 我们定义计时器来分开请求。因为了解到他的分页请求费GET请求直接在URL后面拼接分页参数即可。
 */
init() {
    let _self = this;
    let time = setInterval(function () {
        if (_self.currentPage > _self.page) {
            clearInterval(time);
        } else {
            _self.getDataPackage(_self.baseUrl + `?page=${_self.currentPage}`, _self.currentPage);
            _self.currentPage++;
        }
    }, 1000 * 1);

}

4.发送请求

getDataPackage(url, curPage) {
    console.log(url);
    let _self = this;
    https.get(url, function (response) {
        var chunks = [];
        var size = 0;
        response.on('data', function (chunk) {
            chunks.push(chunk);
            size += chunk.length;
        });
        response.on('end', function () {
            // 将请求到的内容转为jQuery可操作的DOM结构
            let data = Buffer.concat(chunks, size);
            let html = data.toString();
            let $ = cheerio.load(html);  
            
            // 获取内容,在页面上自行通过F12开发者找到对应的标签内容。
            let result = [];
            $('.cmt-list').find('.inner').each(i => {
                let map = {};
                map.user = $('.inner').eq(i).find('.hd').find('.name').text();
                map.img = "http:" + $('.inner').eq(i).find('.hd').find('a').find('img').attr('src');
                map.starts = $('.inner').eq(i).find('.hd').find('.stars').find('span').text();
                map.content = $('.inner').eq(i).find('.cmt-txt').text();
                result.push(map);
                map = {};
            })

            // 处理JSON格式
            let dataStr = JSON.stringify(result).trim().replace(/^\[/, curPage == 1 ? '[' : '').replace(/\]$/, curPage == _self.page ? ']' : ',');

            // 通过fs写入
            fs.writeFile('./pinglun.json', dataStr, {
                    'flag': 'a'
            }, function (err) {
                if (err) throw err;
                console.log('写入成功');
            });
        });
    });
}

5.调用

new crawlData(10);

6.过程图

运行时

7.结果

结果

8.完整代码

const
    https = require('https'),
    fs = require('fs'),
    cheerio = require('cheerio');

class crawlData {
    constructor(page) {
        this.currentPage = 1;
        this.page = page;
        this.baseUrl = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
        this.init();
    }
    init() {
        let _self = this;
        let time = setInterval(function () {
            if (_self.currentPage > _self.page) {
                clearInterval(time);
            } else {
                _self.getDataPackage(_self.baseUrl + `?page=${_self.currentPage}`, _self.currentPage);
                _self.currentPage++;
            }
        }, 1000 * 1);

    }
    getDataPackage(url, curPage) {
        console.log(url);
        let _self = this;
        https.get(url, function (response) {
            var chunks = [];
            var size = 0;
            response.on('data', function (chunk) {
                chunks.push(chunk);
                size += chunk.length;
            });
            response.on('end', function () {
                let data = Buffer.concat(chunks, size);
                let html = data.toString();
                let $ = cheerio.load(html);
                let result = [];
                $('.cmt-list').find('.inner').each(i => {
                    let map = {};
                    map.user = $('.inner').eq(i).find('.hd').find('.name').text();
                    map.img = "http:" + $('.inner').eq(i).find('.hd').find('a').find('img').attr('src');
                    map.starts = $('.inner').eq(i).find('.hd').find('.stars').find('span').text();
                    map.content = $('.inner').eq(i).find('.cmt-txt').text();
                    result.push(map);
                    map = {};
                })

                let dataStr = JSON.stringify(result).trim().replace(/^\[/, curPage == 1 ? '[' : '').replace(/\]$/, curPage == _self.page ? ']' : ',');
                fs.writeFile('./pinglun.json', dataStr, {
                    'flag': 'a'
                }, function (err) {
                    if (err) throw err;
                    console.log('写入成功');
                });
            });
        });
    }
}

new crawlData(10);

完结撒花🎉🎉🎉

  • 本人博客地址:https://reinness.com 站点名称:平凡的你我。 欢迎大家的到来!
Node.js 爬虫添加定时功能通常通过使用各种时间管理库和 Node.js 的特性来实现。下面是一个简化的步骤说明: ### 使用计划任务 (cron jobs) 添加定时爬虫 对于 Linux 和 macOS 操作系统,你可以利用 cron 工具来设置定时任务。在 Windows 系统上,通常使用 Task Scheduler。 #### 步骤一:编写爬虫脚本 首先,你需要有一个运行爬虫JavaScript 文件。例如,我们假设已经创建了一个名为 `scrape.js` 的文件,该文件包含了一些基本的爬虫逻辑。 ```javascript // scrape.js const axios = require('axios'); async function fetchData(url) { try { const response = await axios.get(url); console.log(response.data); } catch (error) { console.error(`Error fetching data from ${url}:`, error); } } fetchData("https://example.com"); ``` #### 步骤二:配置 crontab 或 Task Scheduler 接下来,在 Linux/macOS 上,打开 crontab 来编辑定时任务: - 打开终端并输入 `crontab -e` 进入文本编辑器。 然后在文件中添加一行命令来指定爬虫任务的定时执行。例如,为了每天凌晨两点执行爬虫,可以添加以下行: ```bash 0 2 * * * /usr/bin/node /path/to/scrape.js > /path/to/logfile.txt 2>&1 ``` 这条命令的意思是在每天凌晨两点执行 `/path/to/scrape.js` 脚本,并将输出结果和错误信息写入到 `/path/to/logfile.txt` 中。 保存并关闭文件后,需要重启 crond 服务让新的定时任务生效: ```bash sudo service crond restart ``` 在 Windows 系统上,使用 Task Scheduler 设置定时任务更为直观,步骤包括选择新建任务、设定触发条件、指向执行的 .js 文件等操作。详细步骤取决于系统的版本和具体的用户权限情况。 #### 关联的其他问题: 1. **如何调试 Node.js 爬虫**? 使用日志记录和断点定位错误是非常重要的调试手段,如在 `scrape.js` 中添加 `console.log()` 或者使用像 Mocha 测试框架配合 Chai 断言来进行测试。 2. **如何优化 Node.js 爬虫性能**? 通过限制并发请求数、使用缓存技术、优化网络通信等策略可以提高爬虫效率和稳定性。 3. **处理异步回调和 Promise 在 Node.js 爬虫中的应用**? 异步编程模型是 Node.js 的核心,理解并善用回调函数、Promise 和 async/await 可以使爬虫代码更清晰、易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈宝玉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值