简单的Node爬虫

作者: 陈宝玉啊 | 来源:发表于2020-04-01 09:53 被阅读0次

写在开头

经过一个漫长的寒假,终于也是赶上复工的潮流。祝贺全国人民抗"疫"取得阶段性的胜利。
在平常的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简单的爬虫

    需要安装3个包 : koa, request 让请求变得更简单 , cheerio爬取来的数据,让它变成DOM树,...

  • 简单的Node爬虫

    写在开头 经过一个漫长的寒假,终于也是赶上复工的潮流。祝贺全国人民抗"疫"取得阶段性的胜利。在平常的Node使用过...

  • Node完成简单爬虫

    编写好node代码,终端运行node app.js后 页面显示json数据 [ { "title":"【活动+视...

  • 简单的 nodejs 爬虫

    简单的 nodejs 爬虫 最近想用 node 写爬虫,然后将爬取的数据存入 mongodb。一开始想用 phan...

  • 使用node创建最简单的爬虫

    node创建一个简单的网页爬虫安装node就可以了,创建index.js用到request、fs、cheerio、...

  • node爬虫进阶之——登录

    在之前的文章node入门场景之——爬虫已经介绍过最简单的node爬虫实现,本文在原先的基础上更进一步,探讨一下如何...

  • node爬虫最简单的demo

    1.安装node 2.新建一个文件夹,文件夹里新建一个game.js 3.安装模块 在命令行输入安装模块命令:np...

  • node爬虫之路(一)

    最近对爬虫很感兴趣,我们node.js也是可以写爬虫。所以写一个node爬虫系列,记录我的爬虫之路,感兴趣的同学可...

  • node爬虫快速入门

    node爬虫 初入前端,刚刚接触node,对于耳闻已久的node爬虫非常神往,所以有了这篇文章,项目代码在文章末尾...

  • node.js爬虫基础教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样...

网友评论

    本文标题:简单的Node爬虫

    本文链接:https://www.haomeiwen.com/subject/ktkouhtx.html