由下载PUA教程所引发的node下载图片问题

454 阅读2分钟

背景:女友👧看到了北大PUA新闻后十分气愤,因此想看看PUA都是怎么教的好传授给她的闺蜜们提前预防一下,因此我上网搜了下PUA教程,也就得到了如下搜索链接book.yunzhan365.com/uzsb/yyqh/m…,我们打开可以发现是下图这样的


可以发现每一页都是通过get请求所拉取下来的jpg文件。但是这种东西当然还是保存下来比较安心了,所以我们开始使用node.js把所有页(jpg)都download下来~

开整:

第一种方案 request(输出流方式) + fs.createWriteStream

1.打开终端

mkdir downloadImg && cd downloadImg // 创建文件夹并进入
npm init // 项目初始化(一路回车即可)
npm i request axios --save-dev // 安装request库

2.创建index.js文件并输入以下代码

const request = require("request");
const fs = require("fs");
function download1({ url, filePath, success } = {}) {
    // 打开可写流到filePath   
    const writeStream = fs.createWriteStream(filePath) 
    // 请求后输出到目标位置  
    request(url).pipe(writeStream) 
    writeStream.on("close", function (err, res) {  
        if (err) {      
            console.log(err);
        } else {       
            success && success();   
        }    
    })
}

// 看了一下总数为46页😄
for (let index = 1; index < 47; index++) { 
    const params = {       
        url: `https://book.yunzhan365.com/uzsb/yyqh/files/mobile/${index}.jpg`,  
        filePath: `./${index}.jpg`,       
        success(){     
            console.log(`第${index}页下载完成`)   
        }   
} 

download1(params)}

第二种方案 request(编码二进制) + fs.writeFile

我们可以不使用流的方式进行保存 那么我们需要将返回的数据进行encode为二进制格式,查看文档发现如下信息


因此我们可以写下第二种方法

...

function download2({ url, filePath, success } = {}) {
    request.get({ uri: url, encoding: null }, function (err, res) { 
        if (!err) {            
            fs.writeFile(filePath, res.body, "binary", function (err, res) {
                if (err) {           
                    console.log(err);     
                } else {           
                    success && success();       
                }        
            })    
        }  
    })
}

...

第三种方案 axios + fs.createWriteStream

第三种跟第一种大同小异都是使用流来传输,只是换了一个库为了使用axios的兄弟们看着方便。

const axios = require('axios');
const fs = require('fs')

function download3({ url, filePath, success } = {}) {
    axios({      
        url,   
        responseType: 'stream'  
    }).then(res => {    
        const writeStream = fs.createWriteStream(filePath)  
        res.data.pipe(writeStream)     
        writeStream.on("close", function (err, res) {    
            if (err) {              
                console.log(err);        
            } else {            
                success && success(); 
            }      
        })  
    })
}

...


--------------------------------------

以上便是下载PUA整本📖或者说是下载图片的三种方法,最后还请大家互相真心对待,抵制PUA男😈。

PS:大家是如何把代码从vsCode上复制过来的? 我一复制来一发布就成一行了 😭