date: 2023-03-01
从爬虫角度看正则
正则表达式用途广泛,个人使用过的应用场景大概有:shell脚本中,vi编辑器中字符替换与搜索,爬虫中的网页数据获取。 之前在学习Python的时候有使用过xpath对网页数据进行解析,感觉xpath对网页数据更加专业,因为他可以对网页的整个DOM文档进行精确的匹配。正则也能够对html数据进行匹配,缺点就是比较费脑。每写一条正则不免查阅众多资料。
以下是在学习java项目novel_plus的爬虫模块对正则的一些使用心得。
背景简介
小说精品屋是Github上的一个开源项目,其具备完整的前后台系统与爬虫系统。整个项目完全可以应用于生产环境,且文档较为完善。 在使用爬虫模块进行数据爬取的时候,不免要对原站的一些数据进行处理,以使得爬虫在进行爬取的时候获取正确的数据并入库。
在使用开发环境的时候,遇到一些小坑。 坑一: 配置文档中有两种方式存储小说数据,db和文本。 想要使用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]*
以上差不多就是用到的一些正则。
注意:本文归作者所有,未经作者允许,不得转载