需要用到cheerio包
cheerio官方文档:https://cheerio.js.org/
- 中文文档:https://github.com/cheeriojs/cheerio/wiki/Chinese-README
- 中文文档(简书):https://www.jianshu.com/p/629a81b4e013
1:安装
npm install cheerio
2安装axios 用于发送请求
npm install axios
node 启动文件
const cheerio = require('cheerio') //导入cheerio
const axios = require('axios') //导入axios
const fs = require('fs') //导入fs文件
const url = require('url') //**什么意思
const path = require('path')
let httpUrl = 'https://www.doutula.com/article/list/?page=1'
//网页地址
// 获取页面总数
async function getNum() {
let res = await axios.get(httpUrl)
let $ = cheerio.load(res.data)
let btnLength = $('.pagination li').length
let allNum = $('.pagination li').eq(btnLength - 2).find('a').text() //eq是什么
// console.log('allNum',allNum); eq选择器:选择器选取带有指定 index 值的元素。
return allNum
// 获取页面总数
}
async function spider() {
// 获取所有的页面总数
// let allPageNum =await getNum()
// for(let i=1;i<=2;i++){
// getListPage(i)
// }
// getListPage(allPageNum)
num = 1
timeid = null
function start() {
if (num < 3) {
getListPage(num)
console.log('num', num);
num++
} else {
console.log('定时器暂停');
clearInterval(timeid)
}
}
timeid = setInterval(() => {
console.log(`执行${num}次`);
start()
}, 1000)
}
spider()
async function getListPage(pageNum) {
let httpUrl = 'https://www.doutula.com/article/list/?page=' + pageNum
console.log(`读取第${pageNum}页`);
const res = await axios.get(httpUrl)
// 对网址进行请求
// console.log(res.data);
// 2:cheerio,解析html文档
// cheerio.load :解析文档
let $ = cheerio.load(res.data)
// 获取当前页面的所有表情页面连接
$('#home .col-sm-9>a').each((i, element) => {
// $('#home .col-sm-9>a')加上>号,获取子元素,否则会把所有的a标签找出来
// console.log('i',i,'element',element);需要加$(element) 获取元素之后要用$(元素) 才可以有方法
let pageUrl = $(element).attr('href');
let title = $(element).find('.random_title').text()
// 获取元素的title
let reg = /(.*?)\d/igs; //**正则什么意思
title = reg.exec(title)[1]
// fs.mkdir('./img/' + title) // 报错:Callback must be a function应该是一个函数
fs.mkdir('./img/' + title, function (err) {
if (err) {
console.log(err);
} else {
console.log(`第一${pageNum}创建目录成功:` + './img/' + title);
}
}),
//创建目录 mkdir 是什么指令
// console.log(title);
parsePage(pageUrl, title)
// console.log(11);
})
}
async function parsePage(url, title) {
// 对url发起请求
let res = await axios(url);
// 解析res.data的数据
let $ = cheerio.load(res.data)
$('.pic-content img').each((i, element) => {
let imgUrl = $(element).attr('src') //获取src链接1
// let extName = url.extname(imgUrl) 图片没有拓展名
// console.log(path.parse(imgUrl)); //parse语法
let extName = path.extname(imgUrl)
// extName = path.extname(imgUrl)
// 视频里没有extName
// 获取url.的拓展名
let imgPath = `./img/${title}/${title}-${i}${extName}`
// 图片的路径和名字
let ws = fs.createWriteStream(imgPath) //***什么意思 ws responseType*/
// 创建写入图片流
axios.get(imgUrl, {
responseType: 'stream'
}).then(function (res) {
res.data.pipe(ws) //***pipe是什么语法
console.log('图片加载完成' + imgPath);
res.data.on('close', function () {
// 监听close事件
ws.close()
// 关闭写入流
})
})
})
}