nodejs爬虫初试superagent和cheerio


Posted in NodeJs onMarch 05, 2018

前言

早就听过爬虫,这几天开始学习nodejs,写了个爬虫https://github.com/leichangchun/node-crawlers/tree/master/superagent_cheerio_demo,爬取 博客园首页的文章标题、用户名、阅读数、推荐数和用户头像,现做个小总结。

使用到这几个点:

1、node的核心模块-- 文件系统

2、用于http请求的第三方模块 -- superagent

3、用于解析DOM的第三方模块 -- cheerio

几个模块详细的讲解及API请到各个链接查阅,demo中只有简单的用法。

准备工作

使用npm管理依赖,依赖信息会存放在package.json中

//安装用到的第三方模块
cnpm install --save superagent cheerio

引入所需要用到的功能模块

//引入第三方模块,superagent用于http请求,cheerio用于解析DOM
const request = require('superagent');
const cheerio = require('cheerio');
const fs = require('fs');

请求 + 解析页面

想要爬到博客园首页的内容,首先要请求首页地址,拿到返回的html,这里使用superagent进行http请求,基本的使用方法如下:

request.get(url)
      .end(error,res){
      //do something     
}

向指定的url发起get请求,请求错误时,会有error返回(没有错误时,error为null或undefined),res为返回的数据。

拿到html内容后,要拿到我们想要的数据,这个时候就需要用cheerio解析DOM了,cheerio要先load目标html,然后再进行解析,API和jquery的API非常类似,熟悉jquery上手非常快。直接看代码实例

//目标链接 博客园首页
let targetUrl = 'https://www.cnblogs.com/';
//用来暂时保存解析到的内容和图片地址数据
let content = '';
let imgs = [];
//发起请求
request.get(targetUrl)
    .end( (error,res) => {
      if(error){ //请求出错,打印错误,返回
        console.log(error)
        return;
      }
      // cheerio需要先load html
      let $ = cheerio.load(res.text);
      //抓取需要的数据,each为cheerio提供的方法用来遍历
      $('#post_list .post_item').each( (index,element) => {
        //分析所需要的数据的DOM结构
        //通过选择器定位到目标元素,再获取到数据
        let temp = {
          '标题' : $(element).find('h3 a').text(),
          '作者' : $(element).find('.post_item_foot > a').text(),
          '阅读数' : +$(element).find('.article_view a').text().slice(3,-2),
          '推荐数' : +$(element).find('.diggnum').text()
        }
        //拼接数据
        content += JSON.stringify(temp) + '\n';
        //同样的方式获取图片地址
        if($(element).find('img.pfs').length > 0){
          imgs.push($(element).find('img.pfs').attr('src'));
        }
      });
      //存放数据
      mkdir('./content',saveContent);
      mkdir('./imgs',downloadImg);
    })

存储数据

上面解析DOM之后,已经拼接了所需要的信息内容,也拿到了图片的URL,现在就进行存储,把内容存放到指定目录的txt文件中,而且下载图片到指定目录

先创建目录,使用nodejs核心的文件系统

//创建目录
function mkdir(_path,callback){
  if(fs.existsSync(_path)){
    console.log(`${_path}目录已存在`)
  }else{
    fs.mkdir(_path,(error)=>{
      if(error){
        return console.log(`创建${_path}目录失败`);
      }
      console.log(`创建${_path}目录成功`)
    })
  }
  callback(); //没有生成指定目录不会执行
}

有了指定目录之后,可以写入数据了,txt文件的内容已经有了,直接写入就可以了使用writeFile()

//将文字内容存入txt文件中
function saveContent() {
  fs.writeFile('./content/content.txt',content.toString());
}

取到了图片的链接,所以需要再使用superagent下载图片,存在本地。superagent可以直接返回一个响应流,再配合nodejs的管道,直接把图片内容写到本地

//下载爬到的图片
function downloadImg() {
  imgs.forEach((imgUrl,index) => {
    //获取图片名 
    let imgName = imgUrl.split('/').pop();

    //下载图片存放到指定目录
    let stream = fs.createWriteStream(`./imgs/${imgName}`);
    let req = request.get('https:' + imgUrl); //响应流
    req.pipe(stream);
    console.log(`开始下载图片 https:${imgUrl} --> ./imgs/${imgName}`);     
  } )
}

效果

执行下demo,看下效果,数据已经正常爬下来了

nodejs爬虫初试superagent和cheerio

 

非常简单的一个demo,可能也没有那么严谨,不过总是走出了node的第一小步。

总结

以上所述是小编给大家介绍的nodejs爬虫初试superagent和cheerio,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

NodeJs 相关文章推荐
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 NodeJs
Nodejs模块载入运行原理
Feb 23 #NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 #NodeJs
nodejs微信扫码支付功能实现
Feb 17 #NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 #NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 #NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 #NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 #NodeJs
You might like
NO3第三帝国留言簿制作过程
2006/10/09 PHP
javascript事件模型代码
2007/07/01 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
TensorFlow损失函数专题详解
2018/04/26 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
python如何统计代码运行的时长
2019/07/24 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
内科护士实习自我鉴定
2013/10/17 职场文书
汽车驾驶求职信
2013/10/25 职场文书
成品仓管员工作职责
2013/12/29 职场文书
支教自我鉴定
2014/01/18 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
会计岗位职责范本
2015/04/02 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
解决python3安装pandas出错的问题
2021/05/20 Python
Python加密技术之RSA加密解密的实现
2022/04/08 Python