// fs模块 功能 读写 追加 文件夹
const fs = require('fs');
// 解析html 功能强大 爬虫必备 像jquery一样的用法
const cheerio = require('cheerio');
// 发起请求 可以用与接收文件流
const request = require('request');
// 建立一个简易服务器
const https = require('https');
// 要爬取的目标url
const url = 'https://www.jiemian.com/lists/31.html';
let a = 0;
https.get(url, res => {
let html = '';
// 设置编码格式,防止获取到的html乱码
res.setEncoding('utf-8');
// 数据到达
res.on('data', chunk => {
html+=chunk;
})
// 请求体数据完毕
res.on('end', () => {
const $ = cheerio.load(html);
saveText($);
})
// close 当前的请求结束
}).on('error', err => {
console.log(err);
});
// 内容处理
function saveText ($) {
// 获取当前页面的所有的列表的数据
const item = $('.list-view .news-view')[a];
// 获取标题的内容
const tit = $(item).find('.news-header a').text().trim();
// 获取图片的地址
const src = $(item).find('.news-img img').attr('src');
fs.mkdir(`./content/${tit}`, error => {
if (!error) {
fs.appendFile(`./content/${tit}/main.txt`, `{tit: ${tit}}`, error => {
if (error) {
console.log('创建失败!')
}
})
saveImg(tit, src, $); // ------------1
} else {
saveText($);
a++;
}
})
}
// 图片处理
function saveImg (tit, src, $) {
// createWriteStream 创建一个可读的文件流
let writeStream = fs.createWriteStream(`./content/${tit}/${a}.jpg`);
// 获取当前图片的信息
let readStream = request(src);
//写入对应的文件夹中
readStream.pipe(writeStream);
// // 监听本次写入是否结束
readStream.on('end', response => {
a++;
if (a <= $('.list-view .news-view').length - 1) {
saveText($)
} else {
console.log('读取完成!')
}
writeStream.end();
})
}
对于图片处理部分,saveImg里面的代码块放在-------1的地方时总是会报错 pipe未处理的错误流 不知道是什么问题导致的 然后按照我现在的写法完全ok 欢迎提问讨论