nodejs批量下载斗图表情包

该博客介绍了如何使用Node.js的axios和cheerio库爬取并下载表情包。作者编写了一个爬虫程序,首先从指定的表情包网站抓取多页表情链接,然后递归请求每个表情的详情页,获取并下载所有图片。在遇到请求失败的情况时,程序会进行重试,直到下载成功。下载的文件存储在本地的image文件夹中,按表情包类别组织。然而,当下载大量文件后,控制台不会自动关闭,可能存在阻塞问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用nodejs写了个爬表情包的功能

用到的包:axios cheerio

首先安装node,再安装包:
npm i axios
npm i cheerio
下面是代码:
//表情包爬取

const axios = require('axios')
const cheerio = require('cheerio')
const { fstat } = require('fs')
const path = require('path')
const fs = require('fs')
const { time, assert, error } = require('console')
const { func } = require('assert-plus')
const { dirname } = require('path')

//表情包网站
var baseUrl = "https://fabiaoqing.com/"

//爬取五页表情
main(5)

//主程序
function main(downloadPage){
    new Promise(()=>{
        for (let i = 0; i < downloadPage; i++) {
            var httpUrl = "https://fabiaoqing.com/bqb/lists/type/hot/page/"+i+".html"
            parsePageOne(httpUrl)     
        }
    })
    // .finally(()=>{
    //     console.log("所有图片写入完成");
    // })
}

//解析主页面,获取各个表情包地址
async function parsePageOne(httpUrl){
    let res = await axios.get(httpUrl)
    let $ = cheerio.load(res.data)

    $('#bqblist a.bqba').each((index, element)=> {
        let url = $(element).attr('href');

        let imgsUrl = new URL(url, baseUrl).href 
         
        parsePageTwo(imgsUrl).catch(error => {
            if (error) {
                //处理请求失败的url
                let failUrl = imgsUrl
                let reqNum = 0//计数器
                dealFaileUrl(failUrl, reqNum)
           }       
       }) 
    })
}

//递归暴力请求,失败了就继续请求,成功就终止
function dealFaileUrl(failUrl, reqNum){
	//失败后0.8秒后再次请求
    setTimeout(() => {
        parsePageTwo(failUrl).catch(error => {
            throw error
        }).then(()=>{//处理成功
            console.log(failUrl+"请求完成!");
            return
        }, ()=>{//处理失败
            reqNum++
            dealFaileUrl(failUrl,reqNum)
            console.log(failUrl+"请求了"+reqNum+"次");
        })
    }, 800);
    
}

//parsePageTwo('https://fabiaoqing.com/bqb/detail/id/54322.html')

//解析各个表情包的地址
async function parsePageTwo(imgsUrl){
    let res = await axios.get(imgsUrl)
    let $ = cheerio.load(res.data)

    let dirName = $('#bqb h1').html()
    
    //去除文件名里的斜杠
    //文件名有特殊字符会报错
    if (dirName) {
        dirName = dirName.replace(/\//g, '')
        dirName = dirName.replace(/\|/g, '')
    }else{
        throw new Error('无法获取表情包名!')
    }

    //创建文件夹
    fs.mkdir(`./image/${dirName}`, { recursive: true }, (error) => {
        if (error) {
            throw error
        }
        console.log("目录创建完成:"+dirName);

        //下载文件
        $('.swiper-wrapper img').each((index, element)=>{
            let imgUrl = $(element).attr('data-original')
    
            //下载
            download(imgUrl, dirName).catch(error => {
                if (error) {
                    console.log("下载失败:"+error);
                }
            })   
        })  
    })
    
}

//download("https://fabiaoqing.com/bqb/detail/id/54329.html")

//下载表情
async function download(imgUrl, dirName){   
        //文件名
        let fileName = path.parse(imgUrl).base
        
        let ws = fs.createWriteStream(`./image/${dirName}/${fileName}`)
        axios.get(imgUrl, { responseType:'stream'}).then(res => {
            res.data.pipe(ws)            
        })

        ws.on('close', ()=>{
            console.log(fileName+"下载完成!");
        })
}


Q: 文件下载过多后,控制台不会自动关闭,而是处于堵塞状态?这个问题一直没有解决,有解决了的可以交流交流...

下载的文件会放在当前目录的image文件夹的各个表情包目录下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值