作家
登录

NodeJs爬虫抓取古代典籍,共计16000个页面心得体会总结及项目分享

作者: 来源: 2017-12-25 14:04:49 阅读 我要评论

【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?


之前研究数据,零零碎散的写过一些数据抓取的爬虫,不过写的比较随便。有很多处所如今看起来并不是很合理 这段时光比较闲,本来是想给之前的项目做重构的。

后来 应用这个周末,索性从新写了一个项目,就是本项目 guwen-spider。今朝这个爬虫照样比较简单的类型的, 直接抓取页面,然后在页面中提取数据,保存数据到数据库。

经由过程与之前写的比较,我认为可贵在于全部法度榜样的结实性,以及响应的容错机制。在昨天写代码的过程中其实也有反竽暌钩, 真正的主体代码其实很快就写完了 ,花了大年夜部分时光是在

做稳定性的调试, 以及寻求一种更合理的方法来处理数据与流程控制的关系。

背景

项目标背景是抓取一个一级页面是目次列表 ,点击一个目次进去 是一个章节 及篇幅列表 ,点击章节或篇幅进入具体的内容页面。

概述

本项目github地址 : guwen-spider (PS:最后面还有彩蛋 ~~逃

项目技巧细节

项目大年夜量用到了 ES7 的async 函数, 更直不雅的反竽暌功法度榜样了的流程。为了便利,在对数据遍历的过程中直接应用了有名的async这个库,所以弗成避免的┞氛样用到了回调promise ,因为数据的处理产生在回调函数中,弗成避免的会碰到一些数据传递的问题,其实也可以直接用ES7的async await 写一个办法来实现雷同的功能。这里扑晡差赞的一个处所是应用了 Class 的 static 办法封装对数据库的操作, static 顾名思义 静态办法 就跟 prototype 一样 ,不会占用额外空间。

项目重要用到了

  1. ES7的 async await 协程做异步有关的逻辑处理。
  2. 应用 npm的 async库 来做轮回遍历,以及并发请求操作。
  3. 应用 log4js 来做日记处理
  4. 应用 cheerio 来处理dom的操作。
  5. 应用 mongoose 来连接mongoDB 做数据的保存以及操作。

目次构造

  • ├── bin // 人口
  • │ ├── booklist.js // 抓取书本逻辑
  • │ ├── chapterlist.js // 抓取章节逻辑
  • │ ├── content.js // 抓取内容逻辑
  • │ └── index.js // 法度榜样人口
  • ├── config // 设备文件
  • ├── dbhelper // 数据库操作办法目次
  • ├── logs // 项目日记目次
  • ├── model // mongoDB 集合操作实例
  • ├── node_modules
  • ├── utils // 对象函数
  • ├── package.json

项目实现筹划分析

对一级目次进行遍历抓取到对应的二级章节目次, 再对章节列表进行遍历 抓取内容,到第三级 内容单位抓取完成 须要保存时,如不雅须要很多的一级目次信息,就须要 这些分层的数据之间进行数据传递 ,想想其实应当是比较复杂的一件工作。所以分开保存数据 必定程度上避开了不须要的复杂的数据传递。

NodeJs爬虫抓取古代典籍,共计16000个页面心得领会总结及衔目分享

今朝我们推敲到 其实我们要抓取到的古文书本数量并不多,古文书本大年夜概只有180本囊括了各类经史。其和章节内容本身是一个很小的数据 ,即一个集合琅绫擎有180个文档记录。 这180本书所有章节抓取下来一共有一万六千个章节,对应须要拜访一万六千个页面爬取到对应的内容。所以选择第二种应当是合理的。

项目实现

主程有三个办法 bookListInit ,chapterListInit,contentListInit, 分别是抓取书本目次,章节列表,书本内容的办法对外公开裸露的初始化办法。经由过程async 可以实现对这三个办法的运行流程进行控制,书本目次抓取完成将数据保存到数据库,然后履行结不雅返回到主法度榜样,如不雅运行成功 主法度榜样则履行根据书本列表对章节列表的抓取,同理对书本内容进行抓取。

项目主人口

惹人的 bookListInit ,chapterListInit,contentListInit, 三个办法

booklist.js

项目是一个典范的多级抓取案例,今朝只有三级,即 书本列表, 书本项对应的 章节列表,一个章节链接对应的内容。 抓取如许的构造可以采取两种方法, 一是 直接大年夜外层到内层 内层抓取完今后再履行下一?外层的抓取, 还有一种就是先把外层抓取完成保存到数据库,然后根据外层抓取到所有内层章节的链接,再次保存,然后大年夜数据库萌芽到对应的链接单位 对之进行内容抓取。这两种筹划各有利弊,其实两种方法我都试过, 后者有一个好处,因为对三个层级是分开抓取的, 如许就可以或许更便利,尽可能多的保存到对应章节的相干数据。 可以试想一下 ,如不雅采取前者 按照正常的逻辑

  1. /** 
  2.  * 初始化人口 
  3.  */ 
  4. const chapterListInit = async() => { 
  5.     const list = await bookHelper.getBookList(bookListModel); 
  6.     if (!list) { 
  7.         logger.error('初始化萌芽书本目次掉败'); 
  8.     } 
     1/6    1 2 3 4 5 6 下一页 尾页

      推荐阅读

      一种Python全局配置规范以及其魔改

    【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞? 一、模块 or global很多初学者有个误区,就是在Python中须要设备一个全局的参数时,起首想到的是global关键>>>详细阅读


    本文标题:NodeJs爬虫抓取古代典籍,共计16000个页面心得体会总结及项目分享

    地址:http://www.17bianji.com/lsqh/40135.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)