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 相关文章推荐
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
详解Nodejs 通过 fs.createWriteStream 保存文件
Oct 10 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
Nov 01 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 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
缓存技术详谈―php
2006/12/14 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python scatter函数用法实例详解
2020/02/11 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
如何进行Linux分区优化
2016/09/13 面试题
农林经济管理专业自荐信
2014/09/01 职场文书
项目备案申请报告
2015/05/15 职场文书