鄒維 李廷元
摘 ?要:為了提高航行通告文件下載效率、節(jié)省人工資源,文章通過Scrapy爬蟲框架,結(jié)合自然語言處理中的信息,分類爬取各民航局發(fā)布的航行通告文本。首先基于網(wǎng)頁數(shù)據(jù)交互模式將網(wǎng)站分類,結(jié)合Selenium自動(dòng)化測(cè)試工具進(jìn)行網(wǎng)頁下載。然后使用樸素貝葉斯算法將網(wǎng)站所有鏈接進(jìn)行分類,區(qū)分為目標(biāo)鏈接以及非目標(biāo)鏈接,從而實(shí)現(xiàn)提取航行通告文本鏈接,此分類模型在領(lǐng)域類網(wǎng)站準(zhǔn)確率為95.97%。
關(guān)鍵詞:Scrapy;爬蟲;Selenium;樸素貝葉斯
中圖分類號(hào):TP391 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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)是關(guān)于任何航行設(shè)施、服務(wù)、程序或危險(xiǎn)的情況建立和變動(dòng)的資料的通知。在航空領(lǐng)域中飛機(jī)能否安全、高效以及正常的飛行,航行通告起著至關(guān)重要的作用,它由國際航行通告室用電信方式發(fā)布。對(duì)于飛行相關(guān)人員來說,及時(shí)的查看此類資料是十分必要的,因?yàn)橐寻l(fā)生的航空事故中,由飛行相關(guān)人員未及時(shí)查看航行資料而引起的事故所占比重較大[1]。然而,各國發(fā)布的航行通告網(wǎng)站結(jié)構(gòu)不同,數(shù)據(jù)量大,文件類型繁多,人工下載效率低,工作量大[2]。
自然語言處理(Natural Language Processing,NLP)是計(jì)算機(jī)科學(xué)與語言學(xué)的融合性學(xué)科。現(xiàn)階段互聯(lián)網(wǎng)的發(fā)展速度,網(wǎng)速以及硬件設(shè)施的提升,使得自然語言相關(guān)文本數(shù)量大幅飆升。傳統(tǒng)的人工或老舊的專家系統(tǒng)在處理和解析如此大量的自然語言文本時(shí)存在人工成本高,誤差大,效率低等一系列問題,因此使用機(jī)器理解自然語言的相關(guān)課題研究受到廣大的關(guān)注。信息抽取作為自然語言處理中的一個(gè)子課題,其核心是在人類理解的非結(jié)構(gòu)化文本中提取出關(guān)鍵的信息,并使其結(jié)構(gòu)化以便機(jī)器理解。因此,如何有效地從大量的航行通告資料數(shù)據(jù)中抽取出對(duì)用戶有用的部分顯得十分重要。對(duì)此,本文從各民航局網(wǎng)站公開發(fā)布的信息中,以AIP文件獲取為例,基于Scrapy爬蟲框架針對(duì)網(wǎng)站結(jié)構(gòu)設(shè)計(jì)開發(fā)航行通告爬蟲[3,4],著重介紹民航局網(wǎng)站結(jié)構(gòu)分析,頁面內(nèi)容獲取、解析以及結(jié)合樸素貝葉斯模型進(jìn)行AIP文本鏈接提取,基于Tkinter框架實(shí)現(xiàn)獲取文件信息展示界面。
本研究基于中國民用航空飛行學(xué)院與中航材導(dǎo)航技術(shù)有限公司合作課題“民航大數(shù)據(jù)人工智能處理技術(shù)”,作者使用合作單位提供的網(wǎng)站鏈接實(shí)現(xiàn)了民航網(wǎng)站關(guān)鍵信息抽取,該技術(shù)后續(xù)將用于民航大數(shù)據(jù)人工智能處理技術(shù)研發(fā)前期的數(shù)據(jù)準(zhǔn)備工作。
1 ?相關(guān)框架和算法
1.1 ?Scrapy爬蟲框架簡介
Scrapy爬蟲框架:功能強(qiáng)大的網(wǎng)絡(luò)爬蟲框架(是實(shí)現(xiàn)爬蟲功能的一個(gè)軟件結(jié)構(gòu)和功能組件集合),基于Python實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲的重要的技術(shù)路線。其包含五個(gè)主要模塊以及兩個(gè)中間件,相關(guān)定義詳見文獻(xiàn)[5]。
1.2 ?Selenium簡介
Selenium為Web應(yīng)用程序的自動(dòng)測(cè)試工具[6],具有簡單方便、易于實(shí)現(xiàn)的優(yōu)點(diǎn),可模擬人工調(diào)用瀏覽器訪問網(wǎng)頁。對(duì)于數(shù)據(jù)交互復(fù)雜、接口難以分析以及涉及數(shù)據(jù)加密的網(wǎng)站,結(jié)合Selenium自動(dòng)測(cè)試工具可直接獲取用戶所見網(wǎng)站數(shù)據(jù)?;诖颂匦栽谂老x獲取由JavaScript代碼動(dòng)態(tài)生成的網(wǎng)頁時(shí)表現(xiàn)良好。
1.3 ?樸素貝葉斯算法
樸素貝葉斯(Naive Bayes)是一個(gè)基于貝葉斯理論的分類器[7]。其基本數(shù)據(jù)滿足:各維度上的特征被分類的條件概率之間是相互獨(dú)立的[8]。優(yōu)點(diǎn)為:
(1)算法簡單。
(2)算法穩(wěn)定且健壯性良好。
(3)對(duì)小規(guī)模數(shù)據(jù)訓(xùn)練表現(xiàn)良好。
本文給定一個(gè)鏈接Pj(f1,f2…fn),f1,f2…fn為進(jìn)行預(yù)處理后構(gòu)成此鏈接的所有特征。計(jì)算此鏈接被分到某個(gè)類別ck的概率Pr(ck|f1,f2…fn),使用概率公式得到:
2 ?具體實(shí)現(xiàn)流程
實(shí)驗(yàn)流程大致可分為網(wǎng)站的分類,網(wǎng)頁文檔獲取,數(shù)據(jù)處理,訓(xùn)練模型鏈接分類最后實(shí)現(xiàn)文本的下載,整體流程如圖1所示。
以下討論實(shí)驗(yàn)的詳細(xì)實(shí)現(xiàn)過程。
2.1 ?網(wǎng)站分類
根據(jù)網(wǎng)頁數(shù)據(jù)交互模式可將網(wǎng)頁分為以下類別:
(1)靜態(tài)網(wǎng)頁。瀏覽器通過鏈接請(qǐng)求到的HTML包含此鏈接提供所有數(shù)據(jù)。
(2)動(dòng)態(tài)網(wǎng)頁。部分?jǐn)?shù)據(jù)由JavaScript通過DOM元素渲染或結(jié)合Ajax向服務(wù)器請(qǐng)求渲染數(shù)據(jù)。
(3)需要點(diǎn)擊操作的網(wǎng)頁。如某些網(wǎng)頁需要用戶登陸或同意閱讀協(xié)議的網(wǎng)頁。
由于Scrapy爬蟲框架處理靜態(tài)網(wǎng)頁良好的表現(xiàn)性,(1)類網(wǎng)頁使用Scrapy爬蟲框架提供AIP足夠,但Scrapy爬蟲框架的下載引擎無法獲取動(dòng)態(tài)網(wǎng)頁中后續(xù)動(dòng)態(tài)生成的數(shù)據(jù),(2)(3)類網(wǎng)站需在Scarpy爬蟲框架的Spider Middlewares模塊中定義新的網(wǎng)頁請(qǐng)求方式,此處結(jié)合Selenium工具模擬人工操作瀏覽器,Selenium工具下載的網(wǎng)頁數(shù)據(jù)即人工操作后所見內(nèi)容,此處選用谷歌瀏覽器,具體實(shí)現(xiàn)步驟為:
(1)下載ChromeDriver驅(qū)動(dòng)。不同瀏覽器對(duì)應(yīng)的驅(qū)動(dòng)不同,實(shí)驗(yàn)中選擇對(duì)應(yīng)的驅(qū)動(dòng)安裝即可。
(2)調(diào)用webdriver.Chrome()函數(shù)聲明瀏覽器對(duì)象。
(3)使用get([url])函數(shù)訪問要請(qǐng)求的頁面,url為對(duì)應(yīng)頁面的鏈接。
(4)最后通過WebDriverWait()設(shè)置等待時(shí)間,等待瀏覽器響應(yīng)后即可獲取帶頁面數(shù)據(jù)。
在通過上述步驟獲取到網(wǎng)頁文檔數(shù)據(jù)后,對(duì)網(wǎng)頁文檔進(jìn)行預(yù)處理。
2.2 ?網(wǎng)頁文檔預(yù)處理
為提高后續(xù)數(shù)據(jù)處理效率,將網(wǎng)頁文檔解析為DOM樹并將其中的樣式、列表、腳本、注釋等噪音信息進(jìn)行過濾,具體實(shí)現(xiàn)過程為:
(1)網(wǎng)頁內(nèi)容分析。由于網(wǎng)站布局沒有特定的統(tǒng)一標(biāo)準(zhǔn),對(duì)給定領(lǐng)域網(wǎng)站進(jìn)行分析,查找存在目標(biāo)鏈接標(biāo)簽,部分國家結(jié)果如表1所示。
由表1可知,目標(biāo)鏈接出現(xiàn)于, 和三種標(biāo)簽中。
(2)網(wǎng)頁數(shù)據(jù)解析。在Scrapy爬蟲框架負(fù)責(zé)處理spider從網(wǎng)頁中抽取的數(shù)據(jù),負(fù)責(zé)清洗、驗(yàn)證和向數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的項(xiàng)目管道模塊,使用Python的Beautiful Soup庫進(jìn)行網(wǎng)頁文檔的解析與操作。Beautiful Soup提供的BeautifulSoup([參數(shù)])函數(shù)將一個(gè)網(wǎng)頁文檔解析為一棵DOM樹,此處參數(shù)為2.1段落中獲取的網(wǎng)頁文檔。
(3)數(shù)據(jù)初步過濾。Beautiful Soup也提供了簡單而強(qiáng)大的方法來瀏覽、搜索、解析DOM樹。通過find_all()搜索文檔樹函數(shù)結(jié)合正則表達(dá)式抽取出網(wǎng)頁中表1展示的三類標(biāo)簽,整理部分結(jié)果如表2所示。
2.3 ?數(shù)據(jù)處理
通過多個(gè)網(wǎng)站AIP文件下載,記錄下載地址進(jìn)行分析。已知URL的組成為:協(xié)議://域名:端口號(hào)/目錄/文件名.文件后綴?參數(shù)=值#標(biāo)志,同一個(gè)網(wǎng)站的協(xié)議、域名以及端口號(hào)是相同的。為減少后期文本向量化以及樸素貝葉斯模型的計(jì)算量,在網(wǎng)頁文檔預(yù)處理階段,截取URL端口號(hào)之后的信息作為基本數(shù)據(jù)。由于要處理的數(shù)據(jù)通過“-”符號(hào)鏈接且無需考慮語義,通過分析實(shí)際數(shù)據(jù),自定義分詞方法,本文使用Python正則庫提供的re.split('[-.#]',text)函數(shù)指定多符號(hào)分割,對(duì)數(shù)據(jù)進(jìn)行分詞。去除分詞后出現(xiàn)的空格和無信息的標(biāo)點(diǎn)符號(hào),最后對(duì)未標(biāo)記訓(xùn)練數(shù)據(jù)進(jìn)行人工標(biāo)記,0表示非目標(biāo)鏈接,1表示目標(biāo)鏈接,指向文件下載地址,結(jié)果如表3所示。數(shù)據(jù)的屬性值之間相互獨(dú)立,由此選定文本分類算法——樸素貝葉斯方法。
Sklearn庫提供封裝好的樸素貝葉斯模型代碼,數(shù)據(jù)來源于選取的4個(gè)網(wǎng)站,從中各提取250個(gè)URL,經(jīng)過上述步驟數(shù)據(jù)處理后,將所有數(shù)據(jù)處理好的數(shù)據(jù)表3中第二列最終處理數(shù)據(jù)及第三列對(duì)應(yīng)標(biāo)記,每對(duì)應(yīng)一行為一組,共1 000組按照8:2的比例隨機(jī)分配,80%作為訓(xùn)練集,20%作為測(cè)試集,將數(shù)據(jù)輸入模型,核心代碼如圖2所示。
此樸素貝葉斯分類器的準(zhǔn)確度為:0.959 7。
2.4 ?目標(biāo)文本下載
將網(wǎng)頁中得到的所有鏈接經(jīng)過以上三步得到目標(biāo)鏈接,在處于Scrapy爬蟲框架的請(qǐng)求和響應(yīng)之間的下載中間件模塊中將目標(biāo)鏈接重組為可訪問鏈接,由Scrapy爬蟲框架的下載器進(jìn)行文件下載,下載后文件保存地址在settings.py中配置,此處文件保存在計(jì)算機(jī)本地E盤。
2.5 ?爬蟲可視化
爬蟲可視化為整個(gè)系統(tǒng)設(shè)計(jì)一個(gè)可操作界面,具體實(shí)現(xiàn)步驟為:
(1)通過Tkinter做出GUI界面,可以通過界面設(shè)置具體要爬取的網(wǎng)站。網(wǎng)站名前添加復(fù)選框以便選擇要爬取的網(wǎng)站。
(2)把要爬取的網(wǎng)站的URL寫入臨時(shí)文件保存起來。每個(gè)網(wǎng)站對(duì)應(yīng)的value值為其對(duì)應(yīng)的網(wǎng)站地址,獲取已勾選的要爬取復(fù)選框的value值,通過Python的open以及write函數(shù)寫入txt文檔并保存以便后續(xù)使用。
(3)通過多進(jìn)程啟動(dòng)Scrapy爬蟲框架。使用多線程防止程序調(diào)用Tkinter界面程序啟動(dòng)爬蟲發(fā)生鎖死,將占據(jù)時(shí)間長的程序中的任務(wù)放在后臺(tái)處理,以實(shí)現(xiàn)給其他任務(wù)分配資源。此處使用Python3線程模塊的threading模塊實(shí)現(xiàn)。
(4)在spider文件中讀取臨時(shí)文件,根據(jù)URL開始爬取頁面。使用Python提供的open以及readlines函數(shù)讀取(2)中寫入txt文檔中的數(shù)據(jù),憑此數(shù)據(jù)開啟爬蟲。
(5)在Pipeline中把爬取的數(shù)據(jù)可持久化保存下來。
(6)爬取完畢后刷新Tkinter界面,把結(jié)果顯示出來。界面如圖3所示。
3 ?結(jié) ?論
通過以上實(shí)驗(yàn),Scrapy爬蟲框架結(jié)合樸素貝葉斯算法實(shí)現(xiàn)領(lǐng)域網(wǎng)站內(nèi)目標(biāo)鏈接獲取,介紹了算法的主要流程和具體實(shí)現(xiàn)的步驟。目前存在的難點(diǎn)和困難有以下幾點(diǎn):
(1)存在多國語言。數(shù)據(jù)的來源為多國發(fā)布的航行通告網(wǎng)站,部分國家未使用統(tǒng)一語言,存在數(shù)據(jù)文本中各國語言與英語混合的現(xiàn)象,不便于網(wǎng)站的分析。
(2)原始數(shù)據(jù)獲取。在非結(jié)構(gòu)化的HTML文件中,獲取進(jìn)行信息抽取的原始數(shù)據(jù)困難,目前給定網(wǎng)站架構(gòu)老舊,未使用H5的語義標(biāo)簽,存在為了實(shí)現(xiàn)結(jié)構(gòu)布局而濫用標(biāo)簽的現(xiàn)象,不便于對(duì)信息的定位以及數(shù)據(jù)的過濾。
(3)不適用所有鏈接。在個(gè)別網(wǎng)站中URL的組成并沒有嚴(yán)格安裝文件名來組成其下載鏈接,因此無法使用本實(shí)驗(yàn)的方法進(jìn)行分類識(shí)別。
下一步,作者考慮加入鏈接的文本內(nèi)容作為特征值并進(jìn)行鏈接的多分類研究。
參考文獻(xiàn):
[1] 田亞琳.關(guān)于在機(jī)場(chǎng)設(shè)施改造期間做好航空情報(bào)信息前置的建議 [J].民航管理,2017(9):51-53.
[2] 陳鳳蘭.基于模糊評(píng)價(jià)的航行通告質(zhì)量評(píng)估方法 [J].科技創(chuàng)新與應(yīng)用,2020(9):134-136.
[3] 王海玲,周志彬.基于Scrapy框架的爬蟲設(shè)計(jì) [J].軟件導(dǎo)刊,2020,19(4):224-228.
[4] 王芳,張睿,宮海瑞.基于Scrapy框架的分布式爬蟲設(shè)計(jì)與實(shí)現(xiàn)[J].信息技術(shù),2019(3):96-101.
[5] 安子建.基于Scrapy框架的網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)與數(shù)據(jù)抓取分析 [D].長春:吉林大學(xué),2017.
[6] 蟲師.Selenium 2自動(dòng)化測(cè)試實(shí)戰(zhàn) [M].北京:電子工業(yè)出版社,2016.
[7] 余芳,姜云飛.一種基于樸素貝葉斯分類的特征選擇方法 [J].中山大學(xué)學(xué)報(bào)(自然科學(xué)版),2004(5):118-120.
[8] FRIEDMAN N,GEIGER D,GOLDSZMIDT M.Bayesian Network Classifiers [J].Machine Learning,1997,29(2-3):131-163.
作者簡介:鄒維(1996—),女,漢族,四川宜賓人,碩士研究生,研究方向:機(jī)器學(xué)習(xí)自然語言處理;李廷元(1967—),男,漢族,四川眉山人,教授,碩士研究生,研究方向:大數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、人工智能。