【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?
之前研究数据,零零碎散的写过一些数据抓取的爬虫,不过写的比较随便。有很多处所如今看起来并不是很合理 这段时光比较闲,本来是想给之前的项目做重构的。
后来 应用这个周末,索性从新写了一个项目,就是本项目 guwen-spider。今朝这个爬虫照样比较简单的类型的, 直接抓取页面,然后在页面中提取数据,保存数据到数据库。
经由过程与之前写的比较,我认为可贵在于全部法度榜样的结实性,以及响应的容错机制。在昨天写代码的过程中其实也有反竽暌钩, 真正的主体代码其实很快就写完了 ,花了大年夜部分时光是在
做稳定性的调试, 以及寻求一种更合理的方法来处理数据与流程控制的关系。
背景
项目标背景是抓取一个一级页面是目次列表 ,点击一个目次进去 是一个章节 及篇幅列表 ,点击章节或篇幅进入具体的内容页面。
概述
本项目github地址 : guwen-spider (PS:最后面还有彩蛋 ~~逃
项目技巧细节
项目大年夜量用到了 ES7 的async 函数, 更直不雅的反竽暌功法度榜样了的流程。为了便利,在对数据遍历的过程中直接应用了有名的async这个库,所以弗成避免的┞氛样用到了回调promise ,因为数据的处理产生在回调函数中,弗成避免的会碰到一些数据传递的问题,其实也可以直接用ES7的async await 写一个办法来实现雷同的功能。这里扑晡差赞的一个处所是应用了 Class 的 static 办法封装对数据库的操作, static 顾名思义 静态办法 就跟 prototype 一样 ,不会占用额外空间。
项目重要用到了
- ES7的 async await 协程做异步有关的逻辑处理。
- 应用 npm的 async库 来做轮回遍历,以及并发请求操作。
- 应用 log4js 来做日记处理
- 应用 cheerio 来处理dom的操作。
- 应用 mongoose 来连接mongoDB 做数据的保存以及操作。
目次构造
- ├── bin // 人口
- │ ├── booklist.js // 抓取书本逻辑
- │ ├── chapterlist.js // 抓取章节逻辑
- │ ├── content.js // 抓取内容逻辑
- │ └── index.js // 法度榜样人口
- ├── config // 设备文件
- ├── dbhelper // 数据库操作办法目次
- ├── logs // 项目日记目次
- ├── model // mongoDB 集合操作实例
- ├── node_modules
- ├── utils // 对象函数
- ├── package.json
项目实现筹划分析
对一级目次进行遍历抓取到对应的二级章节目次, 再对章节列表进行遍历 抓取内容,到第三级 内容单位抓取完成 须要保存时,如不雅须要很多的一级目次信息,就须要 这些分层的数据之间进行数据传递 ,想想其实应当是比较复杂的一件工作。所以分开保存数据 必定程度上避开了不须要的复杂的数据传递。

今朝我们推敲到 其实我们要抓取到的古文书本数量并不多,古文书本大年夜概只有180本囊括了各类经史。其和章节内容本身是一个很小的数据 ,即一个集合琅绫擎有180个文档记录。 这180本书所有章节抓取下来一共有一万六千个章节,对应须要拜访一万六千个页面爬取到对应的内容。所以选择第二种应当是合理的。
项目实现
主程有三个办法 bookListInit ,chapterListInit,contentListInit, 分别是抓取书本目次,章节列表,书本内容的办法对外公开裸露的初始化办法。经由过程async 可以实现对这三个办法的运行流程进行控制,书本目次抓取完成将数据保存到数据库,然后履行结不雅返回到主法度榜样,如不雅运行成功 主法度榜样则履行根据书本列表对章节列表的抓取,同理对书本内容进行抓取。
项目主人口
惹人的 bookListInit ,chapterListInit,contentListInit, 三个办法
booklist.js
项目是一个典范的多级抓取案例,今朝只有三级,即 书本列表, 书本项对应的 章节列表,一个章节链接对应的内容。 抓取如许的构造可以采取两种方法, 一是 直接大年夜外层到内层 内层抓取完今后再履行下一?外层的抓取, 还有一种就是先把外层抓取完成保存到数据库,然后根据外层抓取到所有内层章节的链接,再次保存,然后大年夜数据库萌芽到对应的链接单位 对之进行内容抓取。这两种筹划各有利弊,其实两种方法我都试过, 后者有一个好处,因为对三个层级是分开抓取的, 如许就可以或许更便利,尽可能多的保存到对应章节的相干数据。 可以试想一下 ,如不雅采取前者 按照正常的逻辑
- /**
- * 初始化人口
- */
- const chapterListInit = async() => {
- const list = await bookHelper.getBookList(bookListModel);
- if (!list) {
- logger.error('初始化萌芽书本目次掉败');
- }
推荐阅读
【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞? 一、模块 or global很多初学者有个误区,就是在Python中须要设备一个全局的参数时,起首想到的是global关键>>>详细阅读
本文标题:NodeJs爬虫抓取古代典籍,共计16000个页面心得体会总结及项目分享
地址:http://www.17bianji.com/lsqh/40135.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示