48
I
nternet  Technology 互联网+
技术
一、引言
目前网络中的服务多以7×24小时的方式进行不间断工作,由于在网站建设中主要侧重点放在了功能的实现上[1],往往忽略了网络安全问题,导致网站在运营过程中对各类网络攻击行为的防护较差。在日常监测过程中,需要实时掌握的系统状态信息包括但不限于网站是否可用、域名解析是否正常、网页内容是否被篡改、挂马等方面。在管理较少的网站时,尚可采用人工的方式进行手动监测,而当网站或者网页数量数以千计时,如何能在短时间内及时准确地批量采集网站状态信息是一个亟须解决的问题。
二、相关技术介绍(一)Scrapy
Scrapy 是一个用Python 编写的自由且开源的网络爬虫框架。其设计初衷是用于爬取网络[2],但也可用作爬取API 数据的网络爬虫。该框架目前由Scrapinghub 公司维护。Scrapy 项目围绕“蜘蛛”(Spiders)构建,Spider 是提供一套指令的自包含的爬网程序。允许开发者重用代码将便于构建和拓展大型的爬虫项目[3]。
1.Twisted
Twisted 是用Python 实现的基于事件驱动的网络引擎框架,Twisted 支持许多常见的传输及应用层协议[5],包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC 及FTP。就像Python 一样,Twisted 也具有“内置电池”(Batteries-included)的特点。Twisted 对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted 应用变得非常方便[6]。
2.Splash
Splash 是一个JavaScript 渲染服务,同时也是一个带有HTTP API 的轻量级Web 浏览器,使用Twisted 和基于Scrapy 的高性能网站状态批量采集系统
QT5在Python3中实现。QT Reactor 用于使服务完全异步,从而允许通过QT 主循环利用Webkit 提高并发性。Splash 的主要功能有:并行处理多个网页;获取HTML 结果和/或截图;关闭图像或使用Adblock
Plus 规则来加快渲染速度;在页面上下文中执行自定义JavaScript;编写Lua 浏览脚本;在Splash-Jupyter 笔记本中开发 Splash Lua 脚本;获取 HAR 格式的详细渲染信息。
三、系统功能概述
本文设计并实现的高性能批量网站状态信息采集系统基于Scrapy 框架实现。在该框架基础上自身结合自身需求设计了数据预处理、网站可用性采集、域名解析和网站首页信息采集、数据持久化存储共五个功能模块。
(一)数据预处理
为了避免因为待采集的网站URL 不规范引起的请求错误,需要对待采集网站域名进行检查、清洗及规整工作。具体功能包括但不限于处理待爬取网站列表中有些URL 没有协议头、一条记录包含多个使用分隔符分隔的多个URL 等情况。
(二)网站响应状态码采集
网站的响应状态码可以体现出网站是否正常可用,因此可采集网站响应状态码作为网站是否可用的判断依据。由于网站的状态是复杂多样的,甚至是动态变化的。因此若要得到更准确的状态码,必须处理那些表示网站状态异常的响应状态码,比如301、302、400、404、501等。同时还需要处理由于网络原因
引起的请求超时等异常情况。
(三)域名解析信息采集
域名解析信息包括域名、对应IP 地址、归属地等。这些信息是通过查询特定的API 获取,这也正是Scrapy 框架的主要功能之一。
(四)网站首页信息采集
摘要:为实现对网站是否可用、域名解析是否发生变化、页面响应速度是否正常等状态的监测,需要定时批量采集上述信息,本文基于Scrapy 框架设计并实现高性能网站状态批量采集系统。利用Scrapy 异步IO 框架高吞吐量的特点,可在短时间内完成大批量网站状态信息采集工作,能够有效地支撑后续网站状态监测分析。关键词:Scrapy;高性能;网站状态;批量采集
赵鹏(1995.01-),男,汉族,宁夏中卫,硕士研究生,通信工程师,研究方向:信息安全方向;
苏楠(1991.06-),男,汉族,宁夏石嘴山,大学本科,专技十级职员,通信工程师,研究方向:网络安全方向;通讯作者:于慧霞(1986.05-),女,回族,宁夏中卫,专技九级职员,通信工程师,研究方向:信息安全方向。
I nternet  Technology
互联网+技术
网站首页信息具体包括网站标题、网站首页文本和全屏截图三类信息。由于目前大量网站都采取了动态网页的设计模式,使用Scrapy直接采集无法获取最终的网站页面状态。因此本模块使用Scrapy-splash插件与Splash服务器相配合,由Scrapy-splash负责发起请求,Splash负责渲染网页并将渲染后的完整网页返回给Scrapy。
(五)数据持久化存储
由于Scrapy最终解析出的数据以字典形式呈现,而MongoDB的操作接口均是以字典作为参数,再借助Scrapy自身提供的管道中间件无需编写SQL语句就可以完成数据的存储工作,更加简洁高效。
四、系统功能架构设计
系统功能架构如图1
所示。
图1  系统功能架构图
(一)系统功能实现
1.数据预处理
BaseSpider模块负责待采集网站列表的清洗及规整工作,可以根据实际需求动态添加处理逻辑。本文主要实现了两类清洗工作:一是对网站URL的检查和规整,二是对一个网站包含多个URL时进行拆分和填充形成多条记录。关键实现代码如下:
For domain in [domain.strip().replace(‘ ‘, ‘’) for domain in line.split(‘;’) if domain]:
L i n e.u p d a t e({‘i d x’:s e l f.g e t_i d x(),’d o m a i n’: domain,’sk_ip’: _ip(domain)})
2.网站响应状态采集
HttpCodeSpider模块通过Scrapy.ScrapyRequest发起Get请求后,正常状态下ScrapyResponse中Status即可作为网站响应状态信息。但当网站状态异常时网站响应状态信息需从异常捕获函数中收集。关键代码实现如下所示:
Def errback(self, failure):
Cb_kwargs = quest.cb_kwargs
I t e m=I n s p e c t o r I t e m({‘d o m a i n’:c b_kwargs[‘domain’],’idx’: cb_kwargs[‘idx’],})scrapy分布式爬虫
Try:
Response = sponse
Item.update({‘status’: response.status,})
Except AttributeError:
Item.update({‘status’: 700,’title’: failure.value})
Yield item
3.域名解析信息采集
ApiSpider模块采集的数据需要通过第三方的查询API获取,该API返回JSON格式的数据结果。发起请求时需在请求头中指定API code作为认证标识,在处理返回的数据时需要记录查询成功和失败的数据。具体实现如下:
If api_ret.setdefault(‘api_msg’).startswith(‘success’):
Wanted_vals = [api_data.setdefault(key) for key in wanted_ keys]
Api_ret.update(dict(zip(wanted_keys, wanted_vals)))
Yield  InspectorItem(api_ret)
else:
Yield InspectorItem(api_ret)
4.网站首页信息采集
当目标网站为动态网站时,普通的Scrapy. ScrapyRequest无法获取准确的网站首页信息,SplashSpider统一借助Scrapy-Splash的SplashRequest接口向Splash服务器发起请求。由Splash完成目标网站的渲染并返回渲染后的网站首页Html和截图信息。由于需要获取网站首页的全屏截图,因此需要在发起请求时指定Render_all参数的值为1。
5.数据持久化存储
DBhelper模块存储到数据库中的字段信息如表1所示。
表1 数据表
序号字段名称字段含义
1Idx网站唯一标识
2Name网站名称
3Domain网站域名
4Status网站响应状态码
5Sk_ip域名解析后的IP
6Api_msg域名解析Api返回消息
7City网站归属城市
8Counry网站归属国家
9Region网站所属区域
10Title网站标题
11Content网站首页文本内容
12Render_image网站首页截图
49
50
I
nternet  Technology 互联网+技术
五、数据采集结果
本次测试中采集的网站数量为7400个。其中网站响应状态码为200的共计4892个,即以最为耗时的网站首页信息采集模块为例,对网站状态该模块从启动到最终结束共耗时5603秒。累计采集了4892个的网站首页标题、首页文本以及首页全屏截图。
六、结束语
不同于一般针对某个网站进行深度的数据采集,本文所提出的采集系统主要是解决如何批量采集网站状态
信息的问题。其难点在于待监测的网站数量庞大、采集的数据来源较为分散、动态网站的数据无法直接通过一次网络请求就完成采集。本文在Scrapy 的基础上结合Scrapy-splash、Splash 等技术手段实现对多个网站状态信息的批量采集和动态网站首页信息的精确采集,能够为后续网站的日常监测和状态分析提供有效支撑。 作者单位:赵鹏 苏楠 于慧霞 国家计算机网络与信
息安全管理中心宁夏分中心
参  考  文  献
[1]聂莉娟,方志伟,李瑞霞.基于Scrapy 框架的网络爬虫抓取实现[J].软件,2022,43(11):18-20.
[2]胡学军,李嘉诚.基于Scrapy-Redis 的分布式爬取当当网图书数据[J].软件工程,2022,25(10):8-11.[3]史媛.基于Scrapy 框架爬取豆瓣图书的设计与实现[J].山西电子技术,2022(04):75-77+86.
[4]伍高巍,刘杰,葛晓龙,等.基于Scrapy 的研招网硕士目录爬虫的设计与实现[J].电脑知识与技术,2022,18(17):53-55.
[5]黄禹,兰洋,张玥,等基于Scrapy 的开源核情报采集系统构建[J].科技视界,2022(17):1-7.
[6]张小秋.基于Scrapy 框架的网络爬虫分析与抓取实现[J].电脑编程技巧与维护,2022(02):18-19+44.[7]王嘉宝,雒伟.基于Scrapy 框架的电影数据爬取和可视化分析[J].西藏科技
,2022(02):64-68.
图2 数据采集结果
参  考  文  献
[1]韦智勇,曹之浩,覃颖忠.基于人脸识别的移动终端身份认证系统的设计与实现[J].企业科技与发展,2020(06):42-45.[2]周明.基于卷积神经网络的人脸识别方法研究[J].中国新通信,2022,24(21):47-49.
[3]丁莲静. 基于局部二值模式与主成分分析人脸识别的研究与应用[D].西南交通大学,2019.[4]蒋勃茏.人脸识别研究及其在移动终端身份认证系统的设计与实现[D].电子科技大学,2021.
的基础数据进行比对,若一致,则跳转到对应的程序界面;若不一致,则返回到登录界面,进行再次认证或采取其他认证方式进行登录。
四、结束语
总而言之,伴随信息技术的发展,人们越来越注重信息系统登录认证的便捷性和安全性。在确保满足工控
系统安全的基础上,此次应用研究所提出的方案,在一定程度上提升了工作效率,促使企业信息化管理更加精细化和人性化,同时提高了一线员工的获得感。作者单位:张修世 赵路 刘坤 安徽中烟工业有限责
任公司阜阳卷烟厂 
赵佳 长沙艾特科技开发有限公司
(上接第47页)