nodejs爬虫superagent和cheerio体验案例

早就听过爬虫,这几天开始学习nodejs,爬取 博客园首页的文章标题、用户名、阅读数、推荐数和用户头像,现做个小总结。

  使用到这几个点:

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

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

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

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

准备工作

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

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

登录后复制

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

//引入第三方模块,superagent用于http请求,cheerio用于解析DOMconst 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) + '';        //同样的方式获取图片地址        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的第一小步。

相关推荐:

node.js [superAgent] 请求使用示例_node.js

NodeJS爬虫详解

Node.js爬虫之网页请求模块详解

以上就是nodejs爬虫superagent和cheerio体验案例的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2785089.html

(0)
上一篇 2025年3月8日 17:19:40
下一篇 2025年3月8日 17:19:47

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Node.js如何爬取豆瓣数据实例分享

    一直自以为自己vue还可以,一直自以为webpack还可以,今天在慕课逛node的时候,才发现,自己还差的很远。众所周知,vue-cli基于webpack,而webpack基于node,对node不了解,谈什么了解webpack。所以就自己…

    2025年3月8日 编程技术
    200
  • JsChart组件使用方法简介

    jschart是什么?jschart能够在网页上生成图标,常用于统计信息,十分好用的一个js组件。 使用JsChart 一。导入jscharts.js  二。编写jscharts.jsp测试页面 1.下载JScharts库 从官网下载JSc…

    编程技术 2025年3月8日
    200
  • iOS与JS交互详解

    这次给大家带来ios与js交互的三个需要注意点的点,ios与js交互的注意事项有哪些,下面给大家举三个经典案列,我们一起来看一下。 1使用CocoaPods导入WebViewJavascriptBridge 这里我们使用最新版本 pod &…

    编程技术 2025年3月8日
    200
  • 简单而又神奇的js特效-满天星星

    这次给大家带来一个简单但是又很好用的js特效代码,满天星星,怎么制作漫天星星?下面就是实战案例,一起来看一下。 代码已经贴在上面了,需要的朋友可以自己动手尝试一下这一段神奇的代码。 相关阅读: HTML中关于盒模型的总结 在HTML中各类型…

    2025年3月8日
    200
  • 怎样用原生JS封装自己需要的插件

    今天想和大家讨论一下我们在工作中对于插件的需求,我们写代码,并不是所有的业务或者逻辑代码都要抽出来复用。首先,我们得看一下是否需要将一部分经常重复的代码抽象出来,写到一个单独的文件中为以后再次使用。再看一下我们的业务逻辑是否可以为团队服务。…

    编程技术 2025年3月8日
    200
  • JS闭包的特性分析

    在body标签中,添加一个u标签,其id为node,ul标签下面有5个li标签。如何在点击不同的li 标签时,弹出其li下标? 1)首先需要获得ul节点  var  node = document.getelementsbyid(‘node…

    编程技术 2025年3月8日
    200
  • js原型详细介绍

    如果大家对js中的原型对象以及prototype属性十分熟悉的话对后面原型链以及继承的理解会十分的容易,这里想和大家分享自己对其的理解,  1  function Person(){ 2 } 3 Person.prototype.name …

    2025年3月8日
    200
  • js中Promise对象实例详解

    假设我现在有个实名验证页面,需要验证身份证号码和真实姓名,实名认证是到公安部系统验证(假设在前端验证),验证通过后我再将当前表单信息保存到提交到我自己后台保存; 方法一 不用promise //外层ajax,校验实名信息$.ajax({  …

    编程技术 2025年3月8日
    200
  • JS面向对象用法实例

    对象是包含了属性和方法的集合体。什么是面向对象呢? 面向对象就是一种编程思想,是一个概念。  在js中,通过一种叫做原型的方式来实现面向对象编程。 nbsp;html>        创建对象点击显示学生信息 //创建一个学生对象 v…

    编程技术 2025年3月8日
    200
  • js深拷贝实例探讨

    深度拷贝就是把父对象拷贝到子对象上,而且两者的内存和以后的操作都互不影响的拷贝,本文主要和大家分享js深拷贝实例探讨,希望能帮助到大家。 (1)方法1 function copy(obj1,obj2){  var obj2=obj2||{}…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论