APP下载

基于Scrapy爬虫框架的领域网站文件爬取

2020-07-09邹维李廷元

现代信息科技 2020年21期
关键词:爬虫

邹维 李廷元

摘  要:为了提高航行通告文件下载效率、节省人工资源,文章通过Scrapy爬虫框架,结合自然语言处理中的信息,分类爬取各民航局发布的航行通告文本。首先基于网页数据交互模式将网站分类,结合Selenium自动化测试工具进行网页下载。然后使用朴素贝叶斯算法将网站所有链接进行分类,区分为目标链接以及非目标链接,从而实现提取航行通告文本链接,此分类模型在领域类网站准确率为95.97%。

关键词:Scrapy;爬虫;Selenium;朴素贝叶斯

中图分类号:TP391      文献标识码:A 文章编号:2096-4706(2020)21-0006-04

Domain Website File Crawling Based on Scrapy Crawler Framework

ZOU Wei,LI Tingyuan

(School of Computer Science,Civil Aviation Flight University of China,Guanghan  618307,China)

Abstract:In order to improve the efficiency of downloading the notice to navigation document and save human resources,the article uses the Scrapy crawler framework combined with the information in natural language processing to classify and crawl the text of navigation notices issued by civil aviation administration. Firstly,web sites are classified based on web data interaction mode,and then web pages are downloaded with Selenium automated testing tool. Then the Naive Bayes algorithm is used to classify all the links of the website into target link and non-target link,so as to extract the text link of the notice of navigation. The accuracy rate of this classification model in the domain website is 95.97%.

Keywords:Scrapy;crawler;Selenium;Naive Bayes

0  引  言

航行通告(NOTAM)是关于任何航行设施、服务、程序或危险的情况建立和变动的资料的通知。在航空领域中飞机能否安全、高效以及正常的飞行,航行通告起着至关重要的作用,它由国际航行通告室用电信方式发布。对于飞行相关人员来说,及时的查看此类资料是十分必要的,因为已发生的航空事故中,由飞行相关人员未及时查看航行资料而引起的事故所占比重较大[1]。然而,各国发布的航行通告网站结构不同,数据量大,文件类型繁多,人工下载效率低,工作量大[2]。

自然语言处理(Natural Language Processing,NLP)是计算机科学与语言学的融合性学科。现阶段互联网的发展速度,网速以及硬件设施的提升,使得自然语言相关文本数量大幅飙升。传统的人工或老旧的专家系统在处理和解析如此大量的自然语言文本时存在人工成本高,误差大,效率低等一系列问题,因此使用机器理解自然语言的相关课题研究受到广大的关注。信息抽取作为自然语言处理中的一个子课题,其核心是在人类理解的非结构化文本中提取出关键的信息,并使其结构化以便机器理解。因此,如何有效地从大量的航行通告资料数据中抽取出对用户有用的部分显得十分重要。对此,本文从各民航局网站公开发布的信息中,以AIP文件获取为例,基于Scrapy爬虫框架针对网站结构设计开发航行通告爬虫[3,4],着重介绍民航局网站结构分析,页面内容获取、解析以及结合朴素贝叶斯模型进行AIP文本链接提取,基于Tkinter框架实现获取文件信息展示界面。

本研究基于中国民用航空飞行学院与中航材导航技术有限公司合作课题“民航大数据人工智能处理技术”,作者使用合作单位提供的网站链接实现了民航网站关键信息抽取,该技术后续将用于民航大数据人工智能处理技术研发前期的数据准备工作。

1  相关框架和算法

1.1  Scrapy爬虫框架简介

Scrapy爬虫框架:功能强大的网络爬虫框架(是实现爬虫功能的一个软件结构和功能組件集合),基于Python实现网络爬虫的重要的技术路线。其包含五个主要模块以及两个中间件,相关定义详见文献[5]。

1.2  Selenium简介

Selenium为Web应用程序的自动测试工具[6],具有简单方便、易于实现的优点,可模拟人工调用浏览器访问网页。对于数据交互复杂、接口难以分析以及涉及数据加密的网站,结合Selenium自动测试工具可直接获取用户所见网站数据。基于此特性在爬虫获取由JavaScript代码动态生成的网页时表现良好。

1.3  朴素贝叶斯算法

朴素贝叶斯(Naive Bayes)是一个基于贝叶斯理论的分类器[7]。其基本数据满足:各维度上的特征被分类的条件概率之间是相互独立的[8]。优点为:

(1)算法简单。

(2)算法稳定且健壮性良好。

(3)对小规模数据训练表现良好。

本文给定一个链接Pj(f1,f2…fn),f1,f2…fn为进行预处理后构成此链接的所有特征。计算此链接被分到某个类别ck的概率Pr(ck|f1,f2…fn),使用概率公式得到:

2  具体实现流程

实验流程大致可分为网站的分类,网页文档获取,数据处理,训练模型链接分类最后实现文本的下载,整体流程如图1所示。

以下讨论实验的详细实现过程。

2.1  网站分类

根据网页数据交互模式可将网页分为以下类别:

(1)静态网页。浏览器通过链接请求到的HTML包含此链接提供所有数据。

(2)动态网页。部分数据由JavaScript通过DOM元素渲染或结合Ajax向服务器请求渲染数据。

(3)需要点击操作的网页。如某些网页需要用户登陆或同意阅读协议的网页。

由于Scrapy爬虫框架处理静态网页良好的表现性,(1)类网页使用Scrapy爬虫框架提供AIP足够,但Scrapy爬虫框架的下载引擎无法获取动态网页中后续动态生成的数据,(2)(3)类网站需在Scarpy爬虫框架的Spider Middlewares模块中定义新的网页请求方式,此处结合Selenium工具模拟人工操作浏览器,Selenium工具下载的网页数据即人工操作后所见内容,此处选用谷歌浏览器,具体实现步骤为:

(1)下载ChromeDriver驱动。不同浏览器对应的驱动不同,实验中选择对应的驱动安装即可。

(2)调用webdriver.Chrome()函数声明浏览器对象。

(3)使用get([url])函数访问要请求的页面,url为对应页面的链接。

(4)最后通过WebDriverWait()设置等待时间,等待浏览器响应后即可获取带页面数据。

在通过上述步骤获取到网页文档数据后,对网页文档进行预处理。

2.2  网页文档预处理

为提高后续数据处理效率,将网页文档解析为DOM树并将其中的样式、列表、脚本、注释等噪音信息进行过滤,具体实现过程为:

(1)网页内容分析。由于网站布局没有特定的统一标准,对给定领域网站进行分析,查找存在目标链接标签,部分国家结果如表1所示。

由表1可知,目标链接出现于 和三种标签中。

(2)网页数据解析。在Scrapy爬虫框架负责处理spider从网页中抽取的数据,负责清洗、验证和向数据库中存储数据的项目管道模块,使用Python的Beautiful Soup库进行网页文档的解析与操作。Beautiful Soup提供的BeautifulSoup([参数])函数将一个网页文档解析为一棵DOM树,此处参数为2.1段落中获取的网页文档。

(3)数据初步过滤。Beautiful Soup也提供了简单而强大的方法来浏览、搜索、解析DOM树。通过find_all()搜索文档树函数结合正则表达式抽取出网页中表1展示的三类标签,整理部分结果如表2所示。

2.3  数据处理

通过多个网站AIP文件下载,记录下载地址进行分析。已知URL的组成为:协议://域名:端口号/目录/文件名.文件后缀?参数=值#标志,同一个网站的协议、域名以及端口号是相同的。为减少后期文本向量化以及朴素贝叶斯模型的计算量,在网页文档预处理阶段,截取URL端口号之后的信息作为基本数据。由于要处理的数据通过“-”符号链接且无需考虑语义,通过分析实际数据,自定义分词方法,本文使用Python正则库提供的re.split('[-.#]',text)函数指定多符号分割,对数据进行分词。去除分词后出现的空格和无信息的标点符号,最后对未标记训练数据进行人工标记,0表示非目标链接,1表示目标链接,指向文件下载地址,结果如表3所示。数据的属性值之间相互独立,由此选定文本分类算法——朴素贝叶斯方法。

Sklearn库提供封装好的朴素贝叶斯模型代码,数据来源于选取的4个网站,从中各提取250个URL,经过上述步骤数据处理后,将所有数据处理好的数据表3中第二列最终处理数据及第三列对应标记,每对应一行为一组,共1 000组按照8:2的比例随机分配,80%作为训练集,20%作为测试集,将数据输入模型,核心代码如图2所示。

此朴素贝叶斯分类器的准确度为:0.959 7。

2.4  目标文本下载

将网页中得到的所有链接经过以上三步得到目标链接,在处于Scrapy爬虫框架的请求和响应之间的下载中间件模块中将目标链接重组为可访问链接,由Scrapy爬虫框架的下载器进行文件下载,下载后文件保存地址在settings.py中配置,此处文件保存在计算机本地E盘。

2.5  爬蟲可视化

爬虫可视化为整个系统设计一个可操作界面,具体实现步骤为:

(1)通过Tkinter做出GUI界面,可以通过界面设置具体要爬取的网站。网站名前添加复选框以便选择要爬取的网站。

(2)把要爬取的网站的URL写入临时文件保存起来。每个网站对应的value值为其对应的网站地址,获取已勾选的要爬取复选框的value值,通过Python的open以及write函数写入txt文档并保存以便后续使用。

(3)通过多进程启动Scrapy爬虫框架。使用多线程防止程序调用Tkinter界面程序启动爬虫发生锁死,将占据时间长的程序中的任务放在后台处理,以实现给其他任务分配资源。此处使用Python3线程模块的threading模块实现。

(4)在spider文件中读取临时文件,根据URL开始爬取页面。使用Python提供的open以及readlines函数读取(2)中写入txt文档中的数据,凭此数据开启爬虫。

(5)在Pipeline中把爬取的数据可持久化保存下来。

(6)爬取完毕后刷新Tkinter界面,把结果显示出来。界面如图3所示。

3  结  论

通过以上实验,Scrapy爬虫框架结合朴素贝叶斯算法实现领域网站内目标链接获取,介绍了算法的主要流程和具体实现的步骤。目前存在的难点和困难有以下几点:

(1)存在多国语言。数据的来源为多国发布的航行通告网站,部分国家未使用统一语言,存在数据文本中各国语言与英语混合的现象,不便于网站的分析。

(2)原始数据获取。在非结构化的HTML文件中,获取进行信息抽取的原始数据困难,目前给定网站架构老旧,未使用H5的语义标签,存在为了实现结构布局而滥用标签的现象,不便于对信息的定位以及数据的过滤。

(3)不适用所有链接。在个别网站中URL的组成并没有严格安装文件名来组成其下载链接,因此无法使用本实验的方法进行分类识别。

下一步,作者考虑加入链接的文本内容作为特征值并进行链接的多分类研究。

参考文献:

[1] 田亚琳.关于在机场设施改造期间做好航空情报信息前置的建议 [J].民航管理,2017(9):51-53.

[2] 陈凤兰.基于模糊评价的航行通告质量评估方法 [J].科技创新与应用,2020(9):134-136.

[3] 王海玲,周志彬.基于Scrapy框架的爬虫设计 [J].软件导刊,2020,19(4):224-228.

[4] 王芳,张睿,宫海瑞.基于Scrapy框架的分布式爬虫设计与实现[J].信息技术,2019(3):96-101.

[5] 安子建.基于Scrapy框架的網络爬虫实现与数据抓取分析 [D].长春:吉林大学,2017.

[6] 虫师.Selenium 2自动化测试实战 [M].北京:电子工业出版社,2016.

[7] 余芳,姜云飞.一种基于朴素贝叶斯分类的特征选择方法 [J].中山大学学报(自然科学版),2004(5):118-120.

[8] FRIEDMAN N,GEIGER D,GOLDSZMIDT M.Bayesian Network Classifiers [J].Machine Learning,1997,29(2-3):131-163.

作者简介:邹维(1996—),女,汉族,四川宜宾人,硕士研究生,研究方向:机器学习自然语言处理;李廷元(1967—),男,汉族,四川眉山人,教授,硕士研究生,研究方向:大数据分析、机器学习、人工智能。

猜你喜欢

爬虫
Python环境下利用Selenium与JavaScript逆向技术爬虫研究
基于Python的网络爬虫和反爬虫技术研究
Python反爬虫设计
基于SCRAPY框架的网络爬虫封锁技术破解研究
大数据爬虫风暴
面向社交网站的主题网络爬虫
基于Scrapy框架的分布式网络爬虫的研究与实现
谁抢走了低价机票
网络爬虫,凶猛来袭
基于Python的网络爬虫程序设计