爬虫案例
- 爬虫案例分析 <主要步骤>
- 获取目标网站 需要被扒网页的数据
- 分析网站内容(cheerio)
- 获取有效信息 下载或者其他操作
- 直接上代码
- 引入模块主模块
- 安装 cheerio 第三方模块,可以使用jQ语法,进行html标签过滤
- 获取去哪了首页网址全部内容 首页内容多,分批爬取进,行拼接
- 使用cheerio,获取img 对应的属性 src
- 根据src 内容,进行重新爬取,再保存到目录文件夹
// 先引入需要的模块 http,https,fs,cheerio
// 提前下载依赖,可以使用jQ 选择器获取内容
// npm i cheerio
const http = require('http');
const https = require('https');
const fs = require('fs');
const cheerio = require('cheerio')
const nodeUrl = 'http://hotel.qunar.com/?kwid=47392517&cooperate=baidu';
http.get(nodeUrl,(res)=>{
// 进行请求的校验,查看返回码及类型是否ok**********************************
const {statusCode} = res;
const contentType = res.headers['content-type'];
console.log(statusCode,contentType);
let err = null;
if(statusCode !== 200){
err = new Error('请求状态码错误');
}else if( !/^text\/html/.test(contentType) ){
err = new Error('请求类型错误');
}
if(err){
console.log(`当前请求 Error: + ${err}`);
res.resume(); //清除缓存
return false;
}
// 获取到的内容操作************************************************
let rowData = ''
res.on('data', (chunk)=>{
rowData += chunk;
// console.log('数据传输OK');
});
res.on('err', (err)=>{
console.log('数据传输有误:' + err);
});
res.on('end', ()=>{
// 保存单文件**************************************
// fs.writeFile('./qunale.html', rowData,(err)=>{
// if(err){
// console.log('err: ' + err);
// }else{
// console.log('写入成功')
// }
// })
let $ = cheerio.load(rowData);
// rowData 爬取到内容处理 单个文件爬取
// let arr = $('img').attr('src');
// console.log(arr);
// https.get(arr,(response)=>{
// var imgData = "";
// response.setEncoding("binary");
// response.on("data", function(chunk){
// imgData += chunk;
// });
// response.on("end", function(){
// fs.writeFile("./Image/age.jpg", imgData, "binary", function(err){
// if(err){
// console.log("down fail:" + err);
// }else{
// console.log("down success");
// }
// });
// });
// })
//爬取到内容处理 多个文件爬取******************************
$('img').each( (index, el)=>{
console.log($(el).attr('src'));
// 下载爬取内容图片
let str = $(el).attr('src');
if( !str.startsWith('https') ){
str = 'https:' + str;
}
https.get(str,(response)=>{
var imgData = "";
response.setEncoding("binary"); //一定要设置response的编码为binary否则会下载下来的图片打不开
response.on("data", function(chunk){
imgData += chunk;
});
response.on("end", function(){
fs.writeFile(`./Image/age${index}.jpg`, imgData, "binary", function(err){
if(err){
console.log("down fail:" + err);
}else{
console.log("down success");
}
});
});
})
})
console.log('数据传输完成:');
})
}).on('error', (error)=>{
console.log(error);
})
图片爬取结果