GitHub - wanglanfeng/Distributed-crawler: 分布式爬虫系统

项目简介

    爬虫系统,是对海量的分散的互联网数据进行采集的系统,是搜索引擎系统的基础。应大数据的需求,分布式爬虫系统是解决传统爬虫出现的无法对网页数据信息的归类和组织的问题。 分布式爬虫,对同一个网站的同类数据,进行结构化。同时,能利用分布式的软件设计方法,实现爬虫的高效采集。

需求分析

  1. 分布式爬虫 --- 通过分布式调度,提高整体效率,同时保证高可用性,具有一定的容错性、具有自动恢复,备份的功能。

  2. 自动结构化 --- 对于具有相同模板的URL集合,能够自动提取数据。对于包含正文的网页,能够提取正文。

  3. 监控系统 --- 图形化的用户界面,方便用户操作,并且对程序运行中的各项数据进行实时监控和展示。

  4. 反爬策略 --- 针对不同网站的反爬虫机制,制订爬虫策略。

开发环境

  开发工具:Eclipse / PyCharm

  操作系统:Linux(Fedora 26)

  编程语言:Python 2.7

总体设计思路

  针对软件需求中的编程语言限制,结合我们自身的技术水平,我们采用了Python作为开发语言。同时,为了更好的贴近实际生产环境,我们的开发及测试均在Linux操作系统上完成。 对于Python 网络爬虫,目前效率和功能最完善的便是Scrapy这个爬虫框架,我们使用它作为基础框架,在其上进行有针对性的修改和优化。 在分布式调度上,我们由本次项目实际需求出发,同时也对主流的算法理论进行了学习,最终制订了"Leader-Worker-Observer"算法来进行分布式调度,保证效率和高可用性。 在需求中,对于数据存储并没有太多要求,所以我们准备了MySQL和MongoDB两套方案,主要对应了较为通用、需要高度事务性的需求和面向文档存储的需求。

Scrapy整体架构

scrapy

  1. 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。

  2. 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。

  3. 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。

  4. 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。

  5. 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

  6. 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

  7. 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。

  8. 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

团队分工及项目进度

团队分工

 负责人:何攀 职责: 1. 进行项目总体设计,制订项目计划。 2. 协调成员间工作,保证项目进度。 3. 编写爬虫代码

 组员1: 康艺杰 职责: 1. 目设计文档的编写。 2. 负责持久化层开发。

 组员2: 宫展京 职责: 1. 负责用户界面层开发。 2. 负责业务逻辑层开发。

项目进度

时间 进度
2017-4-15 ~ 4-21 需求分析,确定使用的技术及开发环境。
2017-4-22 ~ 4-30 查阅理论文献,对技术上的缺失点进行补充。
2017-5-1 ~ 5-10 整体思路规划,对项目进行整体设计。完成人员分工。
2017-5-11 ~ 5-31 实现各个模块,同时进行模块测试,基本实现对应功能。
2017-6-1 ~ 6-7 模块整合,继续测试,对暴露出的问题进行修正。
2017-6-8 ~ 6-10 利用测试数据集,进行不同环境下的测试。
2017-6-11 ~ 6-17 针对测试结果,继续修改项目,同时优化性能。
2017-6-18 ~ 6-22 拍摄展示视频,调整代码格式。
2017-6-22 ~ 6-29 总结项目,编写项目文档。
2017-6-30 提交作品。

分布式调度算法设计

  1. 在本项目中主要分为两大类内容的爬取,爬取流程如下:

(1)电商类: 获得入口 --› 爬取分类页 --› 爬取商品详情

(2)博客/新闻类: 获得入口 --› 爬取分类/博主列表 --› 爬取每篇新闻/博客

可以看出,这两类内容的爬虫都是先抓取大量URL,以深度优先搜索找到要爬取的内容。

  1. 调度模型(本项目中,一共分为三类模型)

(1)Leader: 负责从入口直到分类页的爬取,将URL抽取,以任务的形式,存放到任务队列中,供Worker获取。

(2)Worker: 负责从任务队列中获取任务,爬取商品详情/博客正文/新闻正文。

(3)Observer: 负责监控整个系统运行情况,调度爬虫节点。

  1. 调度流程

(1)Leader获得入口,根据网页类型获取分类页,按照深度优先,直到找到最后一级目录,将商品详情/博客/新闻的URL作为任务插入到任务队列中。

(2)Worker从任务队列中获取任务,爬取正文,完成内容抽取后存入数据库。

(3)Observer负责监控整个系统运行情况,一开始由于任务队列中没有任务,命令全部的Worker都转换为Leader,负责爬取URL。 随着程序的运行,任务队列中的任务逐渐增多,将Leader转换为Worker进行任务处理,保证程序爬取的效率。同时,还将监控各个节点,如果某节点失效,将动态调整Worker和Leader的数量,同时及时通知,让节点重启。在爬取过程中,Observer还监控整个程序任务进度。

  1. 架构图

架构图

反爬策略

(1)禁止使用Cookie,让网站无法识别我们的会话信息。
(2)使用IP池,通过多个代理服务器的IP进行爬取。
(3)使用用户代理,通过多个User-Agent进行爬取。

测试环境

  1. 硬件

   (1) 爬虫集群:阿里云主机 CPU:单核 内存:2GB 磁盘:50GB 带宽:1M

   (2) ZooKeeper集群:腾讯云主机 CPU:单核 内存:1GB 磁盘:20GB 带宽:1M

   (3) 服务端主机:阿里云主机 CPU:单核 内存:2GB 磁盘:50GB 带宽:1M

   (4) 主控端:目前市场一般机器即可

  1. 软件

   (1) 爬虫集群:阿里云主机 操作系统:CentOS 6(Linux内核版本3.10)Python版本2.7

   (2) ZooKeeper集群:腾讯云主机 操作系统:CentOS 6(Linux内核版本3.10)

   (3) ZooKeeper版本 >=3.4.10 JDK版本 >= 1.8 Python版本2.7

   (4) 服务端主机:阿里云主机 操作系统:CentOS 6(Linux内核版本3.10)Python版本2.7

   (5) 主控端:操作系统:Linux / Windows(64位) JDK版本 >= 1.8

项目数据集测试结果

 6月 官方发布了测试数据集,我们将正文提取之后的结果通过官方评分jar包进行了测试,结果如下:

start start result

作品截图说明

1. 全网爬取

  主要有模糊爬取与精确爬取,模糊爬取主要是对各大网站进行DFS+BFS搜索,精确爬取主要是让用户指定网站 指定关键字的具体的搜索某一类关键物品,二者都可以设定任务的优先级。

  

2. 即时爬取

  主要时为了突发性的任务,便于用户直接爬取当前网页的信息,支持各大网站混合输入,系统自动匹配网站模 板,同时将数据自动组织结构化。

  

3. 资源配置(可以管理与配置从机的数量与信息)

  

4. 任务中心(可以查看当前正在运行的任务,并对任务进行一系列的管理操作)

  

5. 实时监控

  可以对所有任务的爬取情况进行实时的监控,并可以保存当前进度图以供查看,并可对进度数据图进行详细的查看。

  

6. 数据展示

  可对全网爬任务所爬下来的数据自动进行结构组织化整理,方便用户查看,支持导出到本地,以便永久查看。

  

7. 数据统计

  是对所有任务所爬取的数据进行统计的展示,可以查看到数据比重图,与任务所爬下来的详细数目。

  

8. 设置中心(主要可以设置 实时监控进度图的自动刷新频率,与作品的主题)