爬虫中的正则表达式

小说精品屋学习之爬虫模块中的正则表达式

Posted by hukss on March 1, 2023

从爬虫角度看正则

正则表达式用途广泛,个人使用过的应用场景大概有:shell脚本中,vi编辑器中字符替换与搜索,爬虫中的网页数据获取。 之前在学习Python的时候有使用过xpath对网页数据进行解析,感觉xpath对网页数据更加专业,因为他可以对网页的整个DOM文档进行精确的匹配。正则也能够对html数据进行匹配,缺点就是比较费脑。每写一条正则不免查阅众多资料。

以下是在学习java项目novel_plus的爬虫模块对正则的一些使用心得。

背景简介

小说精品屋是Github上的一个开源项目,其具备完整的前后台系统与爬虫系统。整个项目完全可以应用于生产环境,且文档较为完善。 在使用爬虫模块进行数据爬取的时候,不免要对原站的一些数据进行处理,以使得爬虫在进行爬取的时候获取正确的数据并入库。

在使用开发环境的时候,遇到一些小坑。 坑一: 配置文档中有两种方式存储小说数据,db和文本。 2023-03-01-08.57.51.png 想要使用txt对小说进行存储,依照注释将db改成file,结果小说死活无法入库,经过一番debug调试,发现在FileBookContentServiceImpl中,使用的是 ‘txt’。如上图,改成txt之后成功运行。

坑二: 使用127.0.0.1:8081/crawl/crawlSource_test.html进行正则测试的时候抛出一个索引越界异常,查阅代码发现需要在正则中使用括号来标识要获取的数据。 比如以下表达式获取某小说站的小说目录: href="/xs/(\d*).html,使用括号括起来的部分代表爬虫程序获取的部分,即:数字cateId。

以下是一些正则的使用:

  • 匹配小说目录: https://www.1qxs.com/all/0_{catId}_0_0_0_{page}.html

  • 获取很多相似数中的部分数据 思路:用简单的正则无法直接匹配,那么可以采用匹配他的上一行或者下一行的方法。使用[\s\S]*来匹配所有。 比如:需要匹配某网页中的分页总数,由于没有提供类似当前页数/总页数的标签,而是以第一页,第二页,第三页。。。最后一页这种情况。可以这么写。 \.\.\.</a>\n\s*<a href="/all/\d_[0-9]*_[0-9]*_[0-9]*_[0-9]*_([0-9])*\.html[\s\S]+</span>

  • 匹配正整数 [0-9]*或者[\d+]
  • 匹配连续的中文字符 [\u4e00-\u9fa5]*

以上差不多就是用到的一些正则。