有些网页做过处理,直接重定向了,这里爬虫只不做处理的一些网页
效果图
代码
// const http = require('http'); //如果是http协议用这个
const http = require('https');
const fs = require('fs');
const request = require('request');
const cheerio = require('cheerio');
let home = 'url';//某些图片可能是这样的www.xxx.com/image/111.png
let url = 'url';// 末尾不要/ 例如复制过来的百度 首页可能是 www.xxx.com/index.html所以加个home
getImgByZY(url);
function getImgByZY(url){
http.get(url, (res) => {
//数据过滤处理
const { statusCode } = res;
const contentType = res.headers['content-type'];
let err;
if(/^[45][0-9][0-9]$/.test(statusCode)){
err = new Error(`请求失败,状态码为:${statusCode}`);
// }else if(!/^image\/\*/.test(contentType)){
}else if(!/^text\/\html/.test(contentType)){
err = new Error(`请求类型错误,类型为${contentType}`);
}
//请求出错时清除缓存
if(err){
console.log(err);
console.log("出错啦");
res.resume();//清除请求缓存
return false;//结束请求
}
res.setEncoding('utf8');
//数据会分段接收 chunk 数据片段
let rawData = '';
res.on('data', (chunk) => {
console.log('数据传输中...');
rawData += chunk;
})
res.on('end', () => {
try {
let $ = cheerio.load(rawData);
getImgUrl($);
} catch (e) {
console.error(e.message);
}
})
}).on('error', (e) => {
console.error(`出现错误: ${e.message}`);
});
}
//获取图片路径
function getImgUrl($){
//图片标签下载
$('img').each((index,item)=>{
let url = $(item).attr('src');
let [realUrl,filename] = [formatUrl(url),getFilename(url)]
download(realUrl,filename);
});
}
//格式化路径
function formatUrl(url){
if(url.match('http')){
return url;
}else{
return home+url;
}
}
//获取文件名
function getFilename(url){
return url.substring(url.lastIndexOf('/')+1,url.length);
}
//执行下载
function download(url,filename){
if (!fs.existsSync('./image2')) {
fs.mkdirSync('./image2');
}
console.log(`下载${filename}中...`);
request(url).pipe(fs.createWriteStream(`./image2/${filename}`))
}