背景

开源小说漫画系统小说精品屋已经诞生了1年时间了,其间很多同学咨询过我数据抓取的原理,我这里抽出空余时间详细说明一下小说爬虫模块的设计与实现。

爬虫模块设计与实现(多爬虫源配置)

  1. 创建application-crawl.yml配置文件,配置不同网站的正则表达式规则。

#爬取的网站名称类型 1:笔趣岛 ,2:笔趣塔, 3:顶点,4:百书斋,5:笔趣阁,6: 笔趣窝,默认百书斋  更多网站解析中,敬请期待biquta:crawlsource:index-url: https://m.biquta.lalist-page-url: https://m.biquta.la/class/{0}/{1}.htmlbook-url-pattern: href="/(\d+_\d+)/"score-pattern: 
(\d+\.\d+)分


book-name-pattern:

>([^/]+)


author-pattern: 作者:([^/]+)<
status-pattern: 状态:([^/]+)
cat-pattern: 类别:([^/]+)
update-time-pattern: 更新:(\d+-\d+-\d+\s\d+:\d+:\d+)
pic-pattern: src="([^>]+)"\s+onerror="this.src=intro-pattern: >([^catalog-url-pattern: 查看完整目录catalog-pattern: ([^/]+)biqudao:crawlsource:index-url: https://m.biqudao.netlist-page-url: https://m.biqudao.net/bqgeclass/{0}/{1}.htmlbook-url-pattern: href="/(bqge\d+)/"score-pattern:

(\d+\.\d+)分

book-name-pattern:

>([^/]+)

author-pattern: >作者:([^/]+)status-pattern: 状态:([^/]+)cat-pattern: 类别:([^/]+)update-time-pattern: 更新:(\d+-\d+-\d+\s\d+:\d+:\d+)pic-pattern: src="([^>]+)"\s+onerror="this.src=intro-pattern: >([^catalog-url-pattern: 查看完整目录catalog-pattern: ([^/]+)dingdian:crawlsource:index-url: http://m.xdingdiann.comlist-page-url: http://m.xdingdiann.com/sort/{0}/{1}.htmlbook-url-pattern: href="/(ddk\d+)/"score-pattern:

(\d+\.\d+)分

book-name-pattern:

>([^/]+)

author-pattern: 作者:([^/]+)<status-pattern: 状态:([^/]+)cat-pattern: 类别:([^/]+)update-time-pattern: 更新:(\d+-\d+-\d+\s\d+:\d+:\d+)pic-pattern: src="([^>]+)"\s+onerror="this.src=intro-pattern: >([^/]+)catalog-url-pattern: 查看完整目录catalog-pattern: ([^/]+)baishuzhai:crawlsource:index-url: https://m.baishuzhai.comlist-page-url: https://m.baishuzhai.com/sort/{0}/{1}.htmlbook-url-pattern: href="/(ibook/\d+/\d+)/"score-pattern:

(\d+\.\d+)分

book-name-pattern:

>([^/]+)

author-pattern: 作者:([^/]+)<status-pattern: 状态:([^/]+)cat-pattern: 类别:([^/]+)update-time-pattern: 更新:(\d+-\d+-\d+)pic-pattern: src="([^>]+)"\s+onerror="this.src=intro-pattern: >([^/]+)catalog-url-pattern: 查看完整目录catalog-pattern: ([^/]+)biquge:crawlsource:index-url: http://m.biquge.infolist-page-url: http://m.biquge.info/paihangbang_lastupdate/{0}.htmlbook-url-pattern: href="/(\d+_\d+)/"score-pattern: (\d+)book-name-pattern: ([^author-pattern: 作者:([^status-pattern:

状态:([^

cat-pattern: ([^update-time-pattern:

更新:(\d+-\d+-\d+T\d+:\d+:\d+)

pic-pattern:

\s*intro-pattern: >([^/]+)catalog-url-pattern: 查看完整目录catalog-pattern: \s*([^\s*

创建基础的爬虫源抽象类,用于接收网站通用配置参数和定义基础的解析入库函数。

/** * 爬虫源 * @author 11797 */@Datapublic abstract class BaseCrawlSource {

/**     * 采集的小说最低评分配置     * */    @Value("${books.lowestScore}")private Float lowestScore;

/**     * 解析数据     * */public abstract void parse();

/**     * 更新书籍     * */public abstract void update();}

创建不同类型网站(Html,Json)的爬虫源抽象类,继承BaseCrawlSource,用于接收网站规则配置参数。

/** * html爬虫源 * @author 11797 */@Datapublic abstract class BaseHtmlCrawlSource extends BaseCrawlSource{

/**     * 首页url     * */private String indexUrl;

/**     * 列表页url     * */private String listPageUrl;

/**     * 书籍url Pattern     * */private String bookUrlPattern;

/**     * 评分 Pattern     * */private String scorePattern;

/**     * 书名 Pattern     * */private String bookNamePattern;

/**     * 作者 Pattern     * */private String authorPattern;

/**     * 状态 Pattern     * */private String statusPattern;

/**     * 类别 Pattern     * */private String catPattern;

/**     * 更新时间 Pattern     * */private String updateTimePattern;

/**     * 封面 Pattern     * */private String picPattern;

/**     * 简介 Pattern     * */private String introPattern;

/**     * 完整目录页url Pattern     * */private String catalogUrlPattern;

/**     * 目录 Pattern     * */private String catalogPattern;

}

创建多个不同网站的爬虫源配置类,这里以百书斋爬虫源为例。

/** * 百书斋爬虫源配置类 * @author 11797 */@Slf4j@Configurationpublic class CrawlBaishuzhaiConfig {

/**     * 必须加此@Primary注解,不然报错,表示有多个爬虫源配置类被加载时默认加载此配置类     * 下一个爬虫源配置类则不需要添加     * */@Bean@Primary@ConfigurationProperties(prefix = "baishuzhai.crawlsource")@ConditionalOnProperty(prefix = "crawl.website",name = "type",havingValue = "4")    public BaseHtmlCrawlSource dingdianCrawlSource() {return new BiquCrawlSource();    }

}

通过配置开启默认爬虫源。

#爬取的网站名称类型 1:笔趣岛 ,2:笔趣塔,3:顶点小说 ,4:百书斋,6: 笔趣窝 更多网站解析中,敬请期待crawl:website:type: 4

定义具体的爬虫源类BiquCrawlSource,继承抽象类BaseHtmlCrawlSource,实现源网站解析方法parse()和数据更新方法update()。解析方法解析小说基础属性,生成解析日志,更新方法通过解析日志采集小说所有数据进行新书入库和老书更新,代码过多,只贴出部分解析代码。

          //解析第一页小说的数据//小说页URI正则匹配Pattern bookUriPatten = compile(getBookUrlPattern());Matcher bookUriMatcher = bookUriPatten.matcher(bookListHtml);                boolean bookUriFind = bookUriMatcher.find();

//小说评分正则匹配Pattern scorePatten = compile(getScorePattern());Matcher scoreMatch = scorePatten.matcher(bookListHtml);                boolean scoreFind = scoreMatch.find();

//小说名正则匹配Pattern bookNamePatten = compile(getBookNamePattern());Matcher bookNameMatch = bookNamePatten.matcher(bookListHtml);                boolean bookNameFind = bookNameMatch.find();

while (bookUriFind && scoreFind && bookNameFind) {try {//小说基础信息能够匹配到Float score = Float.parseFloat(scoreMatch.group(1));if (score < getLowestScore()) {//只采集指定评分以上的小说continue;                        }

//获取小说基础信息,生成采集日志String bookUri = bookUriMatcher.group(1);String bookUrl = getIndexUrl() + "/" + bookUri + "/";String bookName = bookNameMatch.group(1);                        bookService.addBookParseLog(bookUrl, bookName, score, (byte) 10);

                    } catch (Exception e) {//小说解析出现异常,不做处理,继续下一本小说的解析                        log.error(e.getMessage(), e);                    } finally {//跳到下一本小说的解析                        bookUriMatcher.find();                        bookUriFind = bookUriMatcher.find();                        scoreFind = scoreMatch.find();                        bookNameFind = bookNameMatch.find();                    }                }

监听程序启动,注入爬虫源,循环执行源网站解析方法parse()和数据更新方法update() 。

设计原理

为了实时(和源站小说最新章节更新时间保持一致)的采集小说最新更新章节,程序需要循环不断的获取源站最新更新小说分页列表信息,如果一本小说数据全部采集完再采集下一本,而一本小说所有数据采集完是秒级甚至是分钟级的,这样采集完一页是需要一定时间的,而源站最新更新列表是不断刷新的,这样就会因为采集到的分页数据不连贯而导致小说采集遗漏,故小说解析(毫秒级,不会导致采集到的分页数据不连贯)与小说更新操作(秒级或分钟级)分开来做。

项目仓库地址

https://github.com/201206030/fiction_house

数据字典模块设计_使用正则表达式采集整站小说数据小说精品屋爬虫模块的设计与实现...相关推荐

  1. Python模拟登录实战,采集整站表格数据

    本节主要内容有: 通过requests库模拟表单提交 通过pandas库提取网页表格 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. ...

  2. 完美天空下载站php程序,织梦CMS高仿天空软件站|软件下载站源码整站带数据

    织梦CMS高仿天空软件站|软件下载站源码整站带数据是一款基于DEDECMS5.5开发制作的仿天空软件站的源码,适用于软件下载.资源下载等网站使用. 安装方法: 1.首先打开你的网址 然后就会出现ded ...

  3. 卓岚物联小程序通过4G串口服务器采集供热站流量计数据

    卓岚物联小程序通过4G串口服务器采集供热站流量计数据 1.概述 远程监控供热站流量计数据,可以随时随地查看流量计瞬时流量.累积流量,平均流量,运行时间等相关参数,可以远程修改流量计相关参数. 图一 4 ...

  4. 搜狐html源码,仿搜狐视频分享源码,红色大气模板,整站带数据

    仿搜狐视频分享源码测试过,完整无错,可以伪静态,功能非常不错. 程序是二次开发于大型系统,性能超稳定,缓存机制强大. 可以添加本地视频,也可以转发去广告的优酷视频 支持批量采集优酷视频,单条采集优酷视 ...

  5. 高端网站建设css3动画响应式模板_网站建设中整站定制与模板建站存在着什么差异...

    公司要在互联网上面有强大的竞争能力,殊不知模板建站是会给你感觉不尽如人意.而整站定制的企业网站不论是竞争能力還是客户体验都能够考虑公司的一切要求.下边网站建设企业我就带大伙儿剖析一下,针对整站定制而言 ...

  6. python模块名限定_python 正则表达式 匹配 ?的使用 限定符 sys.re模块

    特殊字符:注意\b是匹配单词而非字符串的开始和结束: \w不能匹配汉字 限定符放在匹配符的后边 2 括号分组: (\d\d\d){2} #有括号匹配6位数字 \d\d\d{2} #没有括号匹配4位数字 ...

  7. php仿伊人集源码,仿伊人集wecenter()包含所有功能及官方付费插件,整站带数据...

    演示地址:如有演示站请以演示为准,无演示站以截图为准,源码太多服务器有限,无法搭建所有源码演示站,请谅解! 新手购买指导:1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下 ...

  8. 2300套php网站源码模板 完整后台程序 整站带数据,ID41:建材自适应PC手机平板微信Seo结构送2300套PHP整站源码...

    多平台演示(兼容PC电脑/手机/平板/微信): http://www.2008o.com/jianwang/Html/jianwangzhan45/132.html(复制网址到浏览器访问) 源码大小1 ...

  9. 《UCD火花集2:有效的互联网产品设计 交互/信息设计 用户研究讨论》一1.3 数据—判断淘宝店铺页面设计优劣的显微镜...

    本节书摘来自异步社区<UCD火花集2:有效的互联网产品设计 交互/信息设计 用户研究讨论>一书中的第1章,第1.3节,作者 UCDChina,更多章节内容可以访问云栖社区"异步社 ...

  10. 基于python的影评数据分析_[Python] 通过采集两万条数据,对《无名之辈》影评分析...

    一.说明 本文主要讲述采集猫眼电影用户评论进行分析,相关爬虫采集程序可以爬取多个电影评论. 运行环境:Win10/Python3.5. 分析工具:jieba.wordcloud.pyecharts.m ...

最新文章

  1. 伪语言PHP,PHP语言之伪静态几种做法
  2. ScrollView HorizontalScrollView
  3. Python怎么这么香(洛谷P2788题解,Java语言描述)
  4. P5725 【深基4.习8】求三角形(python3实现)
  5. 12002.i2ctools工具
  6. hdu 1232 畅通工程 最小生成树 并查集
  7. C#实现CAD数据转shape或mdb
  8. css3圆形修边按钮
  9. python中如何调用图像处理库_python怎么调用图像处理
  10. 个人使用unity3d过程中遇到的一些小问题集合之有时候在场景中创建光源会有一条虚线...
  11. AZPR3.0的脱壳教程.
  12. matlab2013基础教程,Matlab2013a教程
  13. 天翼云从业认证(4.3)视频监控云存储解决方案
  14. UML统一建模语言习题一
  15. c语言程序设计实验总结范文,《c语言程序设计》课程实验报告模板.doc
  16. 零基础如何搭建个人网站,附完整建站步骤!
  17. 「 神器 」极简网速监控悬浮窗软件
  18. SumatraPDF的反向搜索
  19. C语言编程之用ellipse画椭圆
  20. 基于JAVA Frame的太阳系行星运转系统

热门文章

  1. C++_auto_ptr与unique_ptr智能指针
  2. 网络_远程开机(ubuntu)
  3. 论文笔记_知名期刊与会议_CV_SLAM_3D Reconstruction
  4. 前端复习笔记(二)——CSS
  5. WebSocket 实现链接 群聊(low low low 版本)
  6. oracle数据库执行sql很慢
  7. Spring MVC如何配置OpenSessionInViewInterceptor并结合Hibernate使用
  8. 使用IdleTest进行TDD单元测试驱动开发演练(3) 之 ASP.NET MVC
  9. 地址坐标LA3708:Graveyard
  10. Jq-模拟最大化最小化关闭