// 爬蟲
const https = require('https')
const fs = require('fs')
const cheerio = require('cheerio')
const url = require('url')
const site = 'https://www.xxx.com/'
const saveFoldersPath = './images'
https.get(site, res => {
let err = ''
if (res.statusCode != 200) {
err = new Error('請求失敗')
}
// 判斷請求格式是否是網頁
if (!/^text\/html/.test(res.headers['content-type'])) { // 格式不是網頁
err = new Error('請求格式不是網頁')
}
if (err) {
res.resume() // 重置緩存
return
}
// 判斷images文件夾是否存在
fs.exists(saveFoldersPath, (cb) => {
!cb && fs.mkdir(saveFoldersPath, () => {})
})
let str = ''
// 數據是分段的
res.on('data', chunk => {
str += chunk
})
// 數據獲取完成
res.on('end', () => {
// fs.writeFileSync('./bili.html', str)
let $ = cheerio.load(str)
$('img').each((index, el) => {
let imgSrc = $(el).attr('src')
// 此時需要做處理
if (!imgSrc.startsWith('http://') && !imgSrc.startsWith('https://')) {
imgSrc = url.parse(site).protocol + imgSrc
}
downLoad(imgSrc)
})
})
}).on('error', (e) => {
console.error(e);
});
function downLoad(imgUrl) {
https.get(imgUrl, (res) => {
// 必須要設置,如果不設置,下載的圖片可能打不開
res.setEncoding('binary')
let imgData = ''
res.on('data', (chunk) => {
imgData += chunk
})
res.on('end', () => {
// 獲取文件信息
let files = parseFile(imgUrl)
// 過濾掉不是.jpg|.png|.gif結尾的imgSrc
if (files[1] == 'jpg' || files[1] == 'JPG' || files[1] == 'png' || files[1] == 'PNG' || files[1] == 'GIF' || files[1] == 'gif') {
// 下載圖片
fs.writeFile(`${saveFoldersPath}/${files.join('.')}`, imgData, 'binary', (err) => {
if (err) {
console.log('dowload fail', err)
} else {
console.log('download success')
}
})
}
})
})
}
function parseFile(imgUrl) {
let urls = imgUrl.split('/')
let fileName = urls[urls.length - 1]
return fileName.split('.')
}
node爬蟲爬取網站圖片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.