node.js爬虫批量下载图片

有些网页做过处理,直接重定向了,这里爬虫只不做处理的一些网页
效果图
在这里插入图片描述
代码

// const http = require('http'); //如果是http协议用这个
const http = require('https');
const fs = require('fs');
const request = require('request');
const cheerio = require('cheerio');
let home = 'url';//某些图片可能是这样的www.xxx.com/image/111.png
let url = 'url';// 末尾不要/ 例如复制过来的百度  首页可能是 www.xxx.com/index.html所以加个home
getImgByZY(url);
function getImgByZY(url){
        http.get(url, (res) => {
            //数据过滤处理
            const { statusCode } = res;
            const contentType = res.headers['content-type'];
            let err;
            if(/^[45][0-9][0-9]$/.test(statusCode)){
                err = new Error(`请求失败,状态码为:${statusCode}`);
            // }else if(!/^image\/\*/.test(contentType)){
            }else if(!/^text\/\html/.test(contentType)){
                err = new Error(`请求类型错误,类型为${contentType}`);
            }
            //请求出错时清除缓存
            if(err){
                console.log(err);
                console.log("出错啦");
                res.resume();//清除请求缓存
                return false;//结束请求
            }
            res.setEncoding('utf8');
            //数据会分段接收 chunk 数据片段
            let rawData = '';
            res.on('data', (chunk) => {
                console.log('数据传输中...');
                rawData += chunk;
            })
            res.on('end', () => {
                try {
                    let $ = cheerio.load(rawData);
                    getImgUrl($);
                } catch (e) {
                    console.error(e.message);
                }
            })
        }).on('error', (e) => {
            console.error(`出现错误: ${e.message}`);
        });
}
//获取图片路径
function getImgUrl($){
     //图片标签下载
     $('img').each((index,item)=>{
         let url = $(item).attr('src');
         let [realUrl,filename] = [formatUrl(url),getFilename(url)]
        download(realUrl,filename);
     });
}
//格式化路径
function formatUrl(url){
    if(url.match('http')){
        return url;
    }else{
        return home+url;
    }
}
//获取文件名
function getFilename(url){ 
    return url.substring(url.lastIndexOf('/')+1,url.length); 
}
//执行下载
function download(url,filename){
        if (!fs.existsSync('./image2')) {
            fs.mkdirSync('./image2'); 
        }
        console.log(`下载${filename}...`);
        request(url).pipe(fs.createWriteStream(`./image2/${filename}`))
}

猜你喜欢

转载自blog.csdn.net/qq_38188047/article/details/106658160