背景:女友👧看到了北大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上复制过来的? 我一复制来一发布就成一行了 😭