背景

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

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

  1. 创建application-crawl.yml配置文件,配置不同网站的正则表达式规则。
#爬取的网站名称类型 1:笔趣岛 ,2:笔趣塔, 3:顶点,4:百书斋,5:笔趣阁,6: 笔趣窝,默认百书斋  更多网站解析中,敬请期待
biquta:
  crawlsource:
    index-url: https://m.biquta.la
    list-page-url: https://m.biquta.la/class/{0}/{1}.html
    book-url-pattern: href="/(d+_d+)/"
    score-pattern: 
(d+.d+)分
book-name-pattern:

([^/]+)

author-pattern: 作者:([^/]+) cat-pattern: 类别:([^/]+) update-time-pattern: 更新:(d+-d+-d+sd+:d+:d+) pic-pattern: %5D+)" class="review">([^ catalog-url-pattern: 查看完整目录 catalog-pattern: ([^/]+) biqudao: crawlsource: index-url: https://m.biqudao.net list-page-url: https://m.biqudao.net/bqgeclass/{0}/{1}.html book-url-pattern: href="/(bqged+)/" score-pattern:
(d+.d+)分
book-name-pattern:

([^/]+)

author-pattern:
  • 作者:([^/]+)
  • status-pattern: 状态:([^/]+) cat-pattern: 类别:([^/]+) update-time-pattern: 更新:(d+-d+-d+sd+:d+:d+) pic-pattern: %5D+)" class="review">([^ catalog-url-pattern: 查看完整目录 catalog-pattern: ([^/]+) dingdian: crawlsource: index-url: http://m.xdingdiann.com list-page-url: http://m.xdingdiann.com/sort/{0}/{1}.html book-url-pattern: href="/(ddkd+)/" score-pattern:
    (d+.d+)分
    book-name-pattern:

    ([^/]+)

    author-pattern: 作者:([^/]+) cat-pattern: 类别:([^/]+) update-time-pattern: 更新:(d+-d+-d+sd+:d+:d+) pic-pattern: %5D+)" class="review">([^/]+) catalog-url-pattern: 查看完整目录 catalog-pattern: ([^/]+) baishuzhai: crawlsource: index-url: https://m.baishuzhai.com list-page-url: https://m.baishuzhai.com/sort/{0}/{1}.html book-url-pattern: href="/(ibook/d+/d+)/" score-pattern:
    (d+.d+)分
    book-name-pattern:

    ([^/]+)

    author-pattern: 作者:([^/]+) cat-pattern: 类别:([^/]+) update-time-pattern: 更新:(d+-d+-d+) pic-pattern: %5D+)" class="review">([^/]+) catalog-url-pattern: 查看完整目录 catalog-pattern: ([^/]+) biquge: crawlsource: index-url: http://m.biquge.info list-page-url: http://m.biquge.info/paihangbang_lastupdate/{0}.html book-url-pattern: href="/(d+_d+)/" score-pattern: (d+) book-name-pattern: ([^ author-pattern: 作者:([^状态:([^ cat-pattern: ([^ update-time-pattern: 更新:(d+-d+-d+Td+:d+:d+) pic-pattern:
    s*([^/]+) catalog-url-pattern: 查看完整目录 catalog-pattern:
    s*([^s*
    1. 创建基础的爬虫源抽象类,用于接收网站通用配置参数和定义基础的解析入库函数。
    /**
     * 爬虫源
     * @author 11797
     */
    @Data
    public abstract class BaseCrawlSource {
    
        /**
         * 采集的小说最低评分配置
         * */
        @Value("${books.lowestScore}")
        private Float lowestScore;
    
        /**
         * 解析数据
         * */
        public abstract void parse();
    
    
        /**
         * 更新书籍
         * */
        public abstract void update();
    }
    
    1. 创建不同类型网站(Html,Json)的爬虫源抽象类,继承BaseCrawlSource,用于接收网站规则配置参数。
    /**
     * html爬虫源
     * @author 11797
     */
    @Data
    public 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;
    
    
    }
    
    1. 创建多个不同网站的爬虫源配置类,这里以百书斋爬虫源为例。
    /**
     * 百书斋爬虫源配置类
     * @author 11797
     */
    @Slf4j
    @Configuration
    public class CrawlBaishuzhaiConfig {
    
    
        /**
         * 必须加此@Primary注解,不然报错,表示有多个爬虫源配置类被加载时默认加载此配置类
         * 下一个爬虫源配置类则不需要添加
         * */
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "baishuzhai.crawlsource")
        @ConditionalOnProperty(prefix = "crawl.website",name = "type",havingValue = "4")
        public BaseHtmlCrawlSource dingdianCrawlSource() {
            return new BiquCrawlSource();
        }
    
    
    }
    
    1. 通过配置开启默认爬虫源。
    #爬取的网站名称类型 1:笔趣岛 ,2:笔趣塔,3:顶点小说 ,4:百书斋,6: 笔趣窝 更多网站解析中,敬请期待
    crawl:
      website:
        type: 4
    
    1. 定义具体的爬虫源类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 
    1. 监听程序启动,注入爬虫源,循环执行源网站解析方法parse()和数据更新方法update() 。

    设计原理

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

    项目仓库地址

    https://github.com/201206030/fiction_house

    推荐阅读更多精彩内容

    • mybatis-plus真正批量新增和更新
      使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql执行,下面进行优化。 1.添加Ins...
      归来_仍是少年阅读 2,363评论 14赞 9
    • 堡垒大屏
      基于AIOps理念研发的新一代运维监控大屏,全盘展示IT运行状态,减轻运维人员的重复性工作量,提高IT系统排错速度...
      NateIT阅读 287评论 0赞 0
    • 年轻人不讲武德,竟然想白嫖我的开发神器
      大家好,我是白码王子,糖糖。 今天有个同学问我:公司要开发一个流程,没有思路,问我有没有比较好的方法然后啪啪给我一...
      叫我熊大大阅读 5,260评论 8赞 53
    • 装x神器!
      专注Python、AI、大数据,请关注 @七步编程[https://zhuanlan.zhihu.com/peop...
      平凡而诗意阅读 3,583评论 3赞 37
    • [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具
      JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发。JeecgBoot 采用开发模式:Onlin...
      JAVA进阶之道阅读 3,253评论 3赞 48

    文章来源于互联网,如有雷同请联系站长删除:使用正则表达式采集整站小说数据

    发表评论