1、通信管理与技术 2022 年 12 月 第 6 期 9产业聚焦 Industry Focus1引言截至 2021 年 12 月,中国网民人数达到 10.32 亿1,互联网已经成为信息传播的重要途径,但海量的数据也给互联网信息的监控带来很大的困难,传统的对重点网站逐一查看的方式已经不能满足需求,取而代之的是先通过网络爬虫将这些网站的内容爬取到系统平台,然后再进行集中管理和使用。1.1 网络爬虫网络爬虫是互联网时代和大数据时代的共同产物2,是通过程序脚本,按照一定的规则,自动将网站页面的信息获取到指定的服务器上,用来进行集中阅读和分析使用。因其工作机制很像蜘蛛爬网,因此也叫网络蜘蛛3。网络爬虫的主
2、要工作包括三部分:页面的获取、页面的解析和数据的保存4。在有些爬虫框架(如Pyspider)中,提供了数据处理接口(processor),可以在爬取到数据的同时加入其他定制功能,例如下载附件和图片、数据清洗等,提高了网络爬虫的灵活性和适用性。1.2 PyspiderPyspider 是一个用 Python 语言编写的分布式网络爬虫框架,拥有强大的 WebUI 和在线调试功能。与其它爬虫框架相比,Pyspider 不仅支持 MySQL、MongoDB、SQLite 等多种数据库,而且在任务监视、项目管理和结果查询等方面拥有完善的工具。Pyspider是一个开源的爬虫框架,可利用 Python 构
3、建爬虫脚本,实现对目标数据的抓取,在 GitHub 上收获了 15.5K 的星标,是目前最为流行的爬虫框架之一。Pyspider 的 架 构 和 任 务 流 程 如 图 1 所 示5。Pyspider 包括四个组成部分。(1)WebUI:这是 Pyspider 的特色功能之一,可以在线调试爬虫,监督任务,管理项目,查看任务完成情况。基于 Pyspider 的网络爬虫架构的分析与优化 李鲲程1 费军旗1 范春梅2/文1.中国信息通信研究院 2.北京邮电大学摘要:为了从互联网海量数据中获取数据资源,实现对前沿技术动态的监控,使用 Pyspider 框架定时爬取大批网站的信息,并通过 python
4、脚本定时将爬取的数据导入到业务系统中。最初,系统采用了Pyspider 官方推荐的分布式架构,在使用中发现存在任务队列容易堵塞、受网络质量影响大、获得的数据不利于统计和使用等问题。针对上述问题和业务需要,对 Pyspider 框架进行优化,将分布式架构转变为集群式架构;剥离与网页内容获取和保存不相关的任务,在 Pyspider 框架外独立完成。经测试,改进后的架构工作效率和稳定性大幅提升,达到了预期的效果。关键词:Pyspider;网络爬虫;分布式;集群中图分类号:TP29文献标识码:B文章编号:1672-6200(2022)06-0009-04图 1 Pyspider 架构和任务流程1020
5、22 年 12 月 第 6 期 通信管理与技术Industry Focus 产业聚焦 (2)scheduler:汇总采集任务,完成任务调度,将抓取任务分配给 fetcher。(3)fetcher:负责爬取页面内容,然后将内容发送给processor。(4)processor:负责处理爬取的内容,实现数据清洗和入库,并将新的采集任务交给 scheduler。每个 Pyspider 系统只能有一个 scheduler,但是可以分布式部署多个 fetcher 和processor,它们之间通过消息队列(message_queue)进行通信6。Pyspider 的任务队列(task_queue)是顺序
6、执行的,只有当一个任务执行完,scheduler 才会将队列中新的任务分配给 fetcher。任务队列的最大任务数受queue-maxsize 参数的限制,当任务队列长度达到该参数时,就会引发 fetcher 崩溃7。1.3 任务背景目前,业务要求对近百个前沿技术的网站进行监控,第一时间获取这些网站发布的新闻、报告或日志(blog),并下载附带的附件或图片。这些网站的页面都包含一个列表页,每个列表项包含具体的新闻标题、报告名称或者日志标题,并链接到正文页面,最终要爬取的详细信息就在这个正文页面中。根据网站的这一特点,爬虫程序先访问列表页,再根据列表页的信息爬取具体的数据。2通用网络爬虫架构根据
7、Pyspider的架构,本文以MySQL数据库为例,在系统前期采用通用的分布式结构部署网络爬虫,系统结构如图 2 所示。在图 2 所示的架构中,Pyspider 服务器 1 执行WebUI 和 scheduler 任务,维护消息队列,同时运行爬虫系统工作所需的 MySQL 数据库。Pyspider2和 Pyspider3 服务器通过网络与 Pyspider1 服务器进行通信,在 scheduler 的调度下并行执行 fetcher和 processor 任务,并将下载的附件和图片保存在各自的服务器上。最终爬取的数据通过 ETL 工具从Pyspider1 服务器导入到实际业务系统中8,下载的附件
8、和图片通过 rsync 服务同步到业务服务器9。在系统运行的过程中,该架构逐渐暴露出以下问题:(1)整个系统由 Pyspider 服务器 1 的 scheduler统一调度,所有服务器共用一个任务队列。这样,在将网站列表对应的详细信息页面的爬取任务加入队列时,有时会出现消息队列增加的速度超出了服务器的爬取速度。当超过队列的 queue-maxsize 时,就导致图 2 通用 Pyspider 分布式部署通信管理与技术 2022 年 12 月 第 6 期 11产业聚焦 Industry Focusfetcher 崩溃。(2)由于采用分布式部署,Pyspider 服务器 2、3 要频繁地与 Pys
9、pider 服务器 1进行通信,一旦网络出现中断、延迟等故障,导致服务器间不能正常通信,数据采集任务将停止,无法正常工作。(3)在 Pyspider 架 构中,所有的数据采集任务是串行处理的。对于有附件下载需求的爬虫任务,processor 的压力会非常大,特别是在附件过大(其中有些附件的大小达到 200M)或网络状况不佳时,processor 处理下载的时间很长,任务队列中的其他任务就要等待下载任务完成后才能被调度,导致大量被监测的网站信息不能被及时抓取。(4)Pyspider 的任务管理是以项目为单位进行的,近百个爬虫任务完成情况被保存在近百个数据表中,对于整体的数据采集情况很难统计,如果
10、出现了问题也不容易排查。(5)Pyspider 采集到的数据是以 Json 字符串的形式保存在 resultdb 库的项目表中,而非结构化数据,因此,要对采集到的数据进行结构化处理,以便进行后续的业务。3优化方法针对以上问题,对Pyspider的架构做了升级优化,新的架构如图 3 所示。如图 3 所示的架构,三台 Pyspider 服务器没有采取分布式构架,而是采取集群的方式10,最大的差别在于三台服务器之间不再互相通信,而是独立工作。这种方式虽然每一台服务器的工作压力增大,但是不会因为某一个任务或者网络的外部因素导致整个爬虫队列堵塞。架构图中的爬虫源管理服务器用虚线画出,是因为该服务器只是提
11、供爬虫源的管理,并不会产生很大的负载,因此并不需要单独的服务器,可以与三台爬虫服务器中的某一台共享资源。它的主要作用是统一记录爬虫源和每个爬虫源分配到爬虫服务器的信息,可以通过轮询的方式实现最简单的负载均衡11。由于三台网络爬虫服务器是平均分配所有任务,这样每台服务器的队列数都不会过大,不会因为队列中任务过多而导致爬虫系图 3 Pyspider 集群式部署图 4 article 库图 5 数据爬取信息汇总表图 6附件下载表122022 年 12 月 第 6 期 通信管理与技术Industry Focus 产业聚焦 2 刘晓魁.网络爬虫技术与策略分析 J.网络安全技术与应用,2022(05):1
12、7-19.3 翟普.Python 网络爬虫爬取策略对比分析 J.电脑知识与技术,2020,(01):29-30,34.4 卢花,冯新.网络爬虫在批量获取教学资源中的应用 J.福建电脑,2022,38(06):59-61.DOI:10.16707/ki.fjpc.2022.06.016.5 Pyspider.ArchitectureR/OL.2022-06-28.http:/docs.pyspider.org/en/latest/Architecture/6 曹煜.针对动态网络数据的分布式增量获取方法 D.北京邮电大学,2017.7 Pyspider.ArchitectureR/OL.2022-
13、06-28.http:/docs.pyspider.org/en/latest/Architecture/8 包甘盛,罗晓飞.浅析数据 ETL 自动化部署方法及实现 J.广播电视网络,2022,29(04):70-72.DOI:10.16045/ki.catvtec.2022.04.007.9 牟骏,田富强,胡波,叶鑫平.基于 RSYNC 的Linux系统迁移上云方案实现J.科技资讯,2021,19(17):13-15.DOI:10.16661/ki.1672-3791.2107-5042-5725.10 TakadaM.DistributedsystemsforfunandprofitJ.2
14、01311 曲 乾 聪,王 俊.基 于 负 载 反 馈 的 分 布 式数 字 集 群 动 态 负 载 均 衡 算 法 J.计 算 机 应 用 研究,2022,39(02):526-530+542.DOI:10.19734/j.issn.1001-3695.2021.07.0280.作者简介:李鲲程,中国信息通信研究院数据研究中心高级工程师,主要从事大数据相关的软件开发、系统运维和数据分析的工作;费军旗,中国信息通信研究院数据研究中心工程师,主要从事公共数据采集和数据分析等方面的技术工作;范春梅,北京邮电大学教师,主要从事计算机类课程的教学工作,通讯作者。统崩溃。对于架构中每台爬虫服务器包含的
15、MySQL 数据库服务,除了提供本机 Pyspider 管理需要的 taskdb、projectdb 和 resultdb 库外,还根据统一规划的爬取信息,创建了 article 数据库,如图 4 所示,其中的数据表 article 作为数据爬取汇总表,如图 5 所示,用于保存爬取到的数据以及对应的爬虫源信息。通过这个数据表,可以使用结构化数据库的查询工具统一查询爬虫服务器的爬取结果,而不用单独查询每个项目的爬取结果。在 article 库中还设置了附件下载数据表,如图 6所示。将每个爬取任务中需要下载的附件或者图片链接保存在该表中,让单独的程序在数据爬取任务之外定时下载附件,这样就可以避免因
16、为大附件或者网速慢而导致整个数据爬取任务的堵塞。在数据爬取任务完成后,通过 ETL 工具定时将每个爬虫服务器的 article 中的内容抽取到应用系统的数据库中,再通过 rsync 服务,将下载的附件同步到应用系统的文件系统中。这样爬取到的数据就可以供应用系统方便地使用了。4结论优化后的网络爬虫框架运行稳定,很好地解决了由于服务器间网络通信和附件过大等原因导致的数据采集任务停止。在每个爬虫任务的 processor 中增加了结构化数据的存储和各个项目数据的合并,方便数据采集情况的统计和问题排查,在应用中收到很好的效果。后期在多个数据爬取服务器间做负载均衡以及附件下载和数据同步效率等方面还需要做进一步优化。参考文献:1 中国互联网信息中心.第 41 次中国互联网络发展状况统计报告发布 J.2022(2).