通用型静态网页爬虫框架介绍region-based-crawler——以赶集网租房为例
痛点
说下为什么写这么一个爬虫框架?
我们用python爬取静态页面,其实并不难,用bs4之类的库就可以基本解决节点解析取值的功能,我们往往觉得麻烦的地方在于:
每次爬不同的网站要重新写一整套包括解析、存储、多线程、容错、日志等功能的爬虫,有没有一套框架,可以把所有可复用的功能封装起来,只把解析这部分工作丢给开发者呢?
而把相同的部分封装,不同的部分暴露给开发者,其实本身就映射了某一种设计模式,这种设计模式叫做模板方法设计模式
。该设计模式将相同的功能和流程控制放在父类,子类通过集成父类,重写部分功能函数,来实现模板复用的功能。
基于这种思考,设计出一款名为region-based-crawler的通用型爬虫,该爬虫集存储、多线程、容错、日志和网络请求功能为一体,降低爬虫开发者在一些通用功能上的时间消耗,帮助开发者集中精力在网页解析这一核心问题上。
简介
region-based-crawler是一款只需要具备简单的静态页面解析能力,就可以多线程爬取所需数据并存入CSV文件的通用型脚本框架。基于模板方法设计模式,将爬虫通用框架抽象为AbstractSpiderFrame类,你只需要修改继承该父类的具体子类,以此实现不同页面的解析脚本。
该项目已开源,地址在这里https://github.com/ly15927086342/region-based-crawler,欢迎star~
特点
region-based-crawler的特点包括以下几个方面:
- 开闭原则
父类无需改动,只需要在子类重写几个函数即可,针对不同的网页编写不同的解析规则。 - 单/多线程支持
线程数和爬取时间间隔可自定义,部分反爬机制成熟的网站如果爬取过快,容易被封ip - 自带执行日志
目标文件夹下自动生成日志文件log.txt - 高容错性
爬取失败的链接会记录在fail.csv文件中,分为pages和links两种级别。 - 反爬触发提醒
连续超过一定数量链接爬取失败,触发反爬提醒 - 执行简单
只需要运行run函数即可,注意未爬取完毕不要退出程序,否则中间爬取的结果无法最终存储到文件中
适用范围
对使用者的要求
必须具备利用python语言,解析静态网页,获取目标节点信息的能力,例如会使用bs4。
对网站的要求
- 要爬取的网页必须是静态网页的内容,因为内部使用的是requests,不具备动态网页获取能力
- 网站的结构必须是:可以通过一定的规则组合出待爬网页的入口页,可以获取分页数,可以获取具体链接,可以解析目标页面的有效信息。
爬虫原理
整个爬虫的原理如下图所示,首先根据规则拼接出入口页地址,然后从入口页获取分页数,拼接出pages。然后遍历pages,爬取每个分页的所有链接,存入links。最后遍历links,解析详情页,返回目标信息。
run函数的原理如下图:
分两步,第一步是获取所有待爬链接,都写入fail文件;第二步是遍历fail文件,开始爬取具体内容。
这里解释下reSpideFailLinks的原理:
- 如果存在pages类型的链接,先爬pages,得到的新links重新写入fail文件
- 把所有links推入queue,多线程执行,queue不为空则继续爬取,爬取完毕则写入result文件
案例
以赶集网的租房信息为例,我们想爬取整个武汉市的租房信息,分析网站流程如下:
总结
region-based-crawler的原理其实并不难,解决的问题也清晰明了。核心就是将网页解析抛给开发者,而解决剩下的所有非关键问题。
如果你正在从头写一个静态网页爬虫,不妨试试region-based-crawler吧,这会剩下你不少时间!