nodejs 简单爬虫的实现
- nodejs
- cheerio模块
- request模块
以爬取 https://www.lanrentuku.com/tupian/meishitupian/ 的图片为例
/**
* nodejs 简单爬虫
*
* 1.请求网站数据
* 2.数据保存本地 && cheerio 类dom化 然后类jq操作
*/
const http = require('https')
const fs = require('fs')
const cheerio = require('cheerio')
// 引入request模块 发送一次请求保存一张图片,也可以用http模块发送请求,这里两种方式都有写到
const request = require('request')
let url = 'https://www.lanrentuku.com/tupian/meishitupian/'
let imgDir='./img/'
let imgType='.jpg'
http.get(url, (res) => {
// 安全判断
const { statusCode } = res;
const contentType = res.headers['content-type'];
let err = null
if (statusCode !== 200) {
err = new Error('请求状态错误')
} else if (!/^text\/html/.test(contentType)) {
//格式类型是网页
err = new Error('请求类型错误')
}
if (err) {
console.log(err)
res.resume(); //重置缓存
return false
}
fs.mkdir('./img',(err)=>{
if(err){
console.log('创建失败,文件已存在')
}else{
console.log('创建成功')
}
})
// 数据处理
// 数据分段 只要接收数据就会触发data事件 chunk为每次接受的数据片段
let rawData = ''
res.on('data', (chunk) => {
rawData += chunk.toString('utf8')
})
// 数据流传输完毕
res.on('end', () => {
// 通过cheerio进行分析
let $ = cheerio.load(rawData) // 将网页数据进行转换
// 然后可以通过jq语法进行具体的操作,以该网页为例
// 选中所有的img元素,遍历然后取出每一个img元素的地址
$('img').each((index, el) => {
let src = $(el).attr('src')
// 对请求到的数据进行简单处理,这里给每一张图片加https头
let arr = !src.match(/http[s]?:\/\/.+\.(jpg|gif|png)/g) ? 'https:' + src : src
request(arr).pipe(fs.createWriteStream(imgDir + index + imgType));
// 第二种方式采用http.get() 下载图片
// http.get(arr, (res) => {
// // 一定要修改为二进制编码
// res.setEncoding('binary')
// let buf=''
// res.on('data', (chunk) => {
// buf+=chunk
// })
// res.on('end', () => {
// fs.writeFileSync('./img/' + index + '.jpg', buf,'binary',(err)=>{
// if(!err) console.log('上传成功')
// })
// console.log('下载完成')
// })
// })
})
// 将请求的数据保存到本地,可以对网站进行具体分析
fs.writeFileSync('./spilder.html', rawData);
}).on('error', () => { // 绑定一个错误事件
console.log('请求错误')
})
})