Node系列-简易小爬虫爬取图片并下载

NodeJS爬取网站图片并下载

说到爬虫,大家首先想到的一定是Python爬虫(反正我是),前段时间学习nodejs老师讲了一个爬虫案例当时就感到很兴奋,没想到js也能爬虫,下面请看实例代码

1.项目准备

前提是安装了node环境并且npm安装了cheerio(用于筛选数据)。

2.上代码

const https = require('https'); // node内置模块https,如果你要爬取的网站是http协议就要引入http模块,两者用法基本相同
const fs = require('fs'); // node内置模块fs 用于后面操作文件
const cheerio = require('cheerio'); //需要自己npm安装,用于筛选爬到的数据,用法跟jquery类似

let url = 'https://china.nba.com/'; // 要爬取的网站,这里是nba中国官方网站
https.get(url, (res) => {
    // 安全判断 开始
    const {statusCode} = res; //状态码
    const contentType = res.headers['content-type']; //文件类型
    let err = null;
    if (statusCode !== 200) {
        err = new Error('请求状态错误'); //生成一个自定义错误对象
    } else if (!/^text\/html/.test(contentType)) {
        // 格式类型不是网页
        err = new Error('请求类型错误');
    }
    //如果err为真,即上面两个判断出错
    if (err) {
        console.log(err);
        res.resume(); // 重置缓存
        return false;
    }
    //安全判断 -- 结束
    // 以下是数据处理
    let rawData = ''; //数据是一段一段的传输,这用于拼接所有数据
    // 数据分段 只要接受数据就会触发data事件,chunk表示每次接受的数据片段
    res.on('data', (chunk) => {
        rawData += chunk.toString('utf8'); //传输数据是二进制流,所以我们要转为utf8格式
    })
    // 数据流传输完毕
    res.on('end', () => {
        // 将爬到的数据下载到本地
        fs.writeFileSync('./nba.html', rawData); // 这样你的根目录下就会有一个nba的静态网页代码
        console.log('传输完成');
        const $ = cheerio.load(rawData); // 使用cheerio
        var imglist = []; // 用于存储爬取到的图片url地址
        $('img').each((index, el) => {
             imglist.push($(el).attr('src'));
         })
        // console.log(imglist);
        imglist.forEach((item) => {
            loadImg(item); // 封装的下载图片到本地的方法,只需要传入url即可
        })
    })
}).on('error', (err) => {
    console.log(err);
})

// 封装下载图片到本地方法
function loadImg (url) {
    https.get(url, (res) => {
        res.setEncoding("binary"); // 一定要设置response的编码为binary否则会下载下来的图片打不开
        var imgData = '';
        res.on('data', (chunk) => {
            imgData += chunk;
        })
        res.on('end', () => {
            // 将爬到的图片下载到本地,下载前要确认根目录下有imgs文件夹,否则会fail
            fs.writeFile('./imgs/' + Math.floor(Math.random() * 100000) +'.png', imgData, "binary", function(error){
                if(error){
                    console.log("down fail");
                }else{
                    console.log("down success");
                }
            });
        })
    })
}

3.运行文件代码

node splider.js
根目录下的imgs文件夹下就会出现爬取下来的图片
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值