nodejs 实现抓取数据

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');
  })
})

转载于:https://my.oschina.net/shuaihong/blog/1548128

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值