node.js的一个简易爬虫
const http = require('https')//导入模块 ,目标网站是http的要导入http , https的要导入https
const fs = require('fs')//导入文件模块
const cherrio = require('cheerio') //导入第三方模块 , 可以使用jq的选择器等
// let url = 'http://www.haloworld.xyz';
let url = 'https://www.taobao.com/';//url字符串
let json = 'http://nodejs.org/dist/index.json';//测试类型检验的json字符串
let data = '' ;//空字符串
http.get(url, (res) => {
//安全判断
const {statusCode} = res; //z状态码
const contentType = res.headers['content-type']; //文件类型
console.log(statusCode, contentType);
let err = null; 设置err默认为空
if (statusCode !== 200) {
err = new Error('请求状态错误')
} else if (!/^text\/html/.test(contentType)) {
err = new Error('请求类型错误')
}
if (err) {
console.log(err);
res.resume(); //重置缓存
return; //错误存在不继续向下执行
}
//
//数据分段 , 只要接收数据就会触发data事件 , chunk表示每次接收的数据片段
res.on('data', chunk => {
console.log('-----数据传输-----');
// console.log(chunk.toString());
data += chunk.toString(); //请求下来的所有数据
})
//数据流传输完毕会自动触发end事件
res.on('end', () => {
let $ = cherrio.load(data)
//目标数据
let needData = $('img').each((index, el) => {
// console.log($(el).attr('src'));
})
fs.writeFileSync('./needData.txt',needData)//向本地写入目标数据
fs.writeFileSync('./data.txt',data,{ //向本地写入请求下来的左右数据
encoding:'utf-8',
flag:'w'
})
console.log('数据传输完毕,文件已经创建');
})
}).on('error', err => {
console.log('出错' + err);
})