通用型静态网页爬虫框架介绍region-based-crawler——以赶集网租房为例

痛点

说下为什么写这么一个爬虫框架?
我们用python爬取静态页面,其实并不难,用bs4之类的库就可以基本解决节点解析取值的功能,我们往往觉得麻烦的地方在于:

每次爬不同的网站要重新写一整套包括解析、存储、多线程、容错、日志等功能的爬虫,有没有一套框架,可以把所有可复用的功能封装起来,只把解析这部分工作丢给开发者呢?

而把相同的部分封装,不同的部分暴露给开发者,其实本身就映射了某一种设计模式,这种设计模式叫做模板方法设计模式。该设计模式将相同的功能和流程控制放在父类,子类通过集成父类,重写部分功能函数,来实现模板复用的功能。

基于这种思考,设计出一款名为region-based-crawler的通用型爬虫,该爬虫集存储、多线程、容错、日志和网络请求功能为一体,降低爬虫开发者在一些通用功能上的时间消耗,帮助开发者集中精力在网页解析这一核心问题上。

简介

region-based-crawler是一款只需要具备简单的静态页面解析能力,就可以多线程爬取所需数据并存入CSV文件的通用型脚本框架。基于模板方法设计模式,将爬虫通用框架抽象为AbstractSpiderFrame类,你只需要修改继承该父类的具体子类,以此实现不同页面的解析脚本。

该项目已开源,地址在这里https://github.com/ly15927086342/region-based-crawler,欢迎star~

特点

region-based-crawler的特点包括以下几个方面:

  1. 开闭原则
    父类无需改动,只需要在子类重写几个函数即可,针对不同的网页编写不同的解析规则。
  2. 单/多线程支持
    线程数和爬取时间间隔可自定义,部分反爬机制成熟的网站如果爬取过快,容易被封ip
  3. 自带执行日志
    目标文件夹下自动生成日志文件log.txt
  4. 高容错性
    爬取失败的链接会记录在fail.csv文件中,分为pages和links两种级别。
  5. 反爬触发提醒
    连续超过一定数量链接爬取失败,触发反爬提醒
  6. 执行简单
    只需要运行run函数即可,注意未爬取完毕不要退出程序,否则中间爬取的结果无法最终存储到文件中

适用范围

对使用者的要求

必须具备利用python语言,解析静态网页,获取目标节点信息的能力,例如会使用bs4。

对网站的要求

  1. 要爬取的网页必须是静态网页的内容,因为内部使用的是requests,不具备动态网页获取能力
  2. 网站的结构必须是:可以通过一定的规则组合出待爬网页的入口页,可以获取分页数,可以获取具体链接,可以解析目标页面的有效信息。

爬虫原理

整个爬虫的原理如下图所示,首先根据规则拼接出入口页地址,然后从入口页获取分页数,拼接出pages。然后遍历pages,爬取每个分页的所有链接,存入links。最后遍历links,解析详情页,返回目标信息。
通用型静态网页爬虫框架介绍region-based-crawler——以赶集网租房为例
run函数的原理如下图:
分两步,第一步是获取所有待爬链接,都写入fail文件;第二步是遍历fail文件,开始爬取具体内容。
通用型静态网页爬虫框架介绍region-based-crawler——以赶集网租房为例
这里解释下reSpideFailLinks的原理:

  1. 如果存在pages类型的链接,先爬pages,得到的新links重新写入fail文件
  2. 把所有links推入queue,多线程执行,queue不为空则继续爬取,爬取完毕则写入result文件

案例

以赶集网的租房信息为例,我们想爬取整个武汉市的租房信息,分析网站流程如下:
通用型静态网页爬虫框架介绍region-based-crawler——以赶集网租房为例

总结

region-based-crawler的原理其实并不难,解决的问题也清晰明了。核心就是将网页解析抛给开发者,而解决剩下的所有非关键问题。

如果你正在从头写一个静态网页爬虫,不妨试试region-based-crawler吧,这会剩下你不少时间!