2019独角兽企业重金招聘Python工程师标准>>>
nodejs 实现抓取数据
方式一:通过nodejs自身的方法抓取数据
需要模块:http或者https模块 、cheerio(实现dom获取)第三方模块 、fs文件操作、path路径
// 抓数据用的模块 http、https,这两个都是内置模块(核心模块)
// 1.加载 https 模块
var https=require("https");
//加载cherrio模块,可以将抓取的网页通过jquery获取节点的方式获取需要的dom
var cheerio=require("cheerio");
var fs=require("fs");
var path=require("path");
// 2.构建options (构建请求信息:请求报文头)
var options={
hostname:"www.qiushibaike.com",
port:443, //https的端口是443
path:"/",
method:"GET",
headers:{
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
'Upgrade-Insecure-Requests': '1',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6'
}
}
// 3. 调用https的request()方法,向服务器发起请求,并且获取服务器返回的结构(页面代码)
var req=https.request(options,function(res){
// 通过监听 res 的 data 事件 和 end 事件获取服务器返回的数据
var buffer=[];
// 监听data事件获取服务端返回的数据
res.on('data',function(chunk){
buffer.push(chunk); //将服务端获取的buffer数据全部追加至buffer数组中
})
// 监听end事件请求结束
res.on("end",function(){
buffer=buffer.concat(buffer); //拼接buffer数组
var html=buffer.toString('utf8'); //buffer转字符串
// console.log(html);
// 通过 cheerio 模块加载 HTML 代码
var $=cheerio.load(html);
var jokes=[];
// 通过选择器选择我们要的元素
// 1. 选取所有段子的div
$('div.article.block.untagged.mb15').each(function(index,ele){
// 提取段子作者
var author=$(ele).find("h2").text();
// 提取段子正文
var content=$(ele).find("div.content span").text();
//把每个段子放到数组中
jokes.push({
author:author,
content:content
});
});
// 把jokes写入到文件
fs.writeFile(path.join(__dirname,'jokes.json'),JSON.stringify(jokes),function(err){
if(err){
throw err;
}
console.log('ok');
})
})
})
// 监听本次请求是否出错
req.on("error",function(err){
console.log('出错了:' + err);
});
// 如果是post请求方式需要设置请求报文体
// req.write(postData);
// 结束本次请求
// 表示客户端向服务端发送的数据都发送完了
req.end();
方式二:
方式二是通过获取到页面,通过正则表达式的方式,抓取需要的数据----实现原理和方式一基本一样,只是cheerio模板的dom操作,修改为正则匹配
方式三:通过nodejs中的第三方模块require()直接调用---最简单
// 加载模块
var request=require("request");
var fs=require('fs');
// 1.直接调用request方法请求url,并且通过回调函数获取返回值
request('https://www.npmjs.com/package/request',function(err,res,body){
//三个参数 报错信息,res响应,返回的页面
//直接可加载完整个页面
fs.writeFile('./a.html',body,function(err){
if(err){
throw err;
}
console.log('ok');
})
})