黃 禹 蘭 洋 張 玥 胡家全 黃 粲
(中國核動力研究設計院,四川 成都 610000)
二十一世紀以來,突飛猛進的網絡化、信息化、數字化進程,使得社會知識傳播方式發生了巨大變革。互聯網因其多樣性、及時性和共享性的特點,已經成為人們獲取信息的重要載體,滲透到政治、經濟、科研、生活的方方面面。隨之而來的就是大數據時代下海量數據的激增,網絡資源變得多元化,人們面對紛繁多擾的信息資源時,反而陷入了“信息迷航”“信息過載”的困境,而在針對具體領域開源情報(Open Source Intelligence,簡稱OSINT)的獲取方面尤為如此。基于此,不同于通用搜索引擎的基于主題的采集技術應運而生,該技術是傳統搜索引擎的延伸和發展,專注于某一行業或某一領域的信息資源的獲取,具有“專、精、深”的特點,在各領域開源情報獲取方面得到廣泛應用。基于此,本文利用Scrapy技術構建開源核情報采集系統,旨在提升對開源核情報的搜集效率。
基于主題的數據采集技術作為目前主流的開源情報獲取方式,在各領域的數據采集中得到廣泛的應用,周昆團隊構建黨建采集主題用以采集互聯網中的黨建領域頁面內容;屈莉莉等人基于WebMagic框架搭建職位主題用以實現對招聘網站職位需求變化的持續監測;劉燦等人為滿足對教育類新聞關注的實際需求,提出了一種面向教育新聞的采集系統;黃煒團隊提出了一種針對網絡恐怖信息的主題信息采集系統,以實現提升開源網絡采集網絡恐怖信息效率的目的;郭頌等人為準確高效采集航天領域內的競爭情報,設計了一款新的航天領域情報采集的總體框架,實現了航天領域情報的高效采集。
相較于國內,國外對基于主題的數據采集技術的應用起步更早,并且將機器學習等先進算法應用到采集程序中,實現對采集效率的提升。近五年來,Shiqi Deng針對礦產開源情報領域的特點,提出了一種基于文本語義相似度與網頁URL結構結合的主題采集策略,從而較高地提高了互聯網上礦產開源情報的獲取效率;Sumita Gupta等人在主題中融入元數據標準,用以優化數字圖書館搜索引擎,提升檢索結果的匹配度;Aamir Khan與Dilip Kumar Sharma在社交網站中集成本體的概念,使得社交網站的搜索功能成為更加精準的基于用戶信息主題的采集程序,提升了對具體用戶信息的查詢。
綜上,基于主題的數據采集技術在互聯網信息的采集中應用廣泛,是當前緩解“信息迷航”,提升開源情報精準獲取的必要手段。
1.2.1 Scrapy框架
Scrapy是一個能夠快速搭建部署的基于Python語言的基于主題的采集技術運用框架,該框架基于Twisted異步網絡庫處理網絡通信,具有模塊化、定制化、易拓展等點,同時該框架支持采集進程的并行采集和分布式采集,極大地提高了數據采集的效率。Scrapy框架結構如圖1所示。

圖1 Scrapy框架
Scrapy框架主要包含以下五個模塊:
(1)引擎模塊Engine:負責整體的數據協調以及各模塊之間的數據流動。
(2)調度器模塊Scheduler:負責接收Engine的請求,并將請求加入隊列,實際上是對目標URL進行管理。
(3)下載器模塊Downloader:負責下載Web頁面的相關數據,并將這些數據發送給Engine。之后Engine將數據傳給Spider,目的是使Spider的函數對數據進行分析。
(4)采集模塊Spider:用戶自定義的程序,負責分析回應和獲得數據,或者跟蹤深層次的URL。
(5)數據流水線模塊ItemPipeline:負責對獲得的數據進行后續數據處理。處理方式包括:數據冗余消除、數據合法化、數據存儲。
(6)中間件模塊Middlewares:由下載中間件和采集中間件組成,是各組件之間的橋梁。
1.2.2 Xpath技術
Xpath是一門在XML文檔中查找信息的路徑語言。用以對XML文檔中的元素和屬性進行遍歷,并確定數據的位置。Xpath基于XML樹狀結構,因此能夠方便地查詢樹狀結構的節點,在基于主題的數據采集行為中常用作查詢語言用以提取網頁結構中所需的數據信息。
常用的Xpath路徑表達式如表1所示。

表1 Xpath路徑表達式
面對海量的互聯網網頁數據時,僅利用通過搜索引擎(如百度、谷歌、必應等)對國外開源核情報進行檢索,會返回大量的檢索結果,由于商業競價、SEO優化等因素的影響,排序靠前的匹配結果可能并不是人們所期望的內容,并且會包含大量與專業領域無關的網頁。基于傳統搜索引擎在專業開源情報獲取方面的局限,本文的開源核情報采集系統利用Python語言基于Scrapy框架進行定制開發,實現對目標站點下信息資源的發現、采集、解析與存儲。下面就開源核情報采集系統的功能需求進行簡要介紹:
(1)成功請求響應。設計的基于主題的開源情報采集程序能夠在對目標站點發起請求后,從目標站點成功獲取響應數據。
(2)完成網頁文本內容解析與提取。系統頁面解析模塊能夠從網絡頁面中成功解析到需要提取的數據字段。
(3)數據分類存儲。系統存儲模塊能夠根據針對數據按照其結構化和非結構化特性進行分類后在進行存儲。
(4)用戶界面。用戶能夠通過一個可視化的系統界面實現對各采集程序的開啟與關閉等相關操作。
本文所構建的開源核情報采集系統,整體采用C/S架構,通過前端頁面完成與用戶的交互,后端服務器提供后臺的業務邏輯處理,使用Mysql數據庫對采集的網頁信息進行存儲。主要分為頁面請求模塊、情報解析模塊、情報存儲子模塊以及用戶界面模塊。系統結構如圖2所示。

圖2 系統基本結構
由圖2可得,本系統頁面請求模塊主要實現通過網絡采集程序對站點集群內的所有站點的URL發起網絡請求,從而獲取到數據的響應;情報解析模塊主要包括網頁解析以及字段提取,從而實現對目標網頁內所需內容的解析與采集提取;情報存儲模塊包括Mysql數據庫和本地文件存儲路徑,用于對采集結果保存和文本附件的存儲;用戶界面模塊為一個可視化的交互界面,由Web瀏覽器和用戶共同構成,用戶通過瀏覽器打開本系統的前端頁面實現交互操作,通過封裝好的接口連接到后端,實現對用戶在前端操作的響應。
本文基于Scrapy的開源核情報采集系統的設計與實現過程中所采用的開發以及測試環境為Windows 10操作系統,開發工具為Pycharm,使用Python為系統主要開發語言,使用的開發框架為Scrapy框架,前端頁面使用JavaScript與HTML,存儲數據庫為Mysql數據庫。前后端的通信遵循Http/Https協議。
本系統所構建的頁面請求模塊,通過對站點集群內的所有站點URL發起網絡請求,采取深度優先的采集策略,使得數據采集程序采集流程從一個站點初始化種子URL出發,發起網絡請求,盡可能在目錄頁URL中提取到最多的詳情頁URL。在響應的頁面中提取新的URL鏈接添加到待采集的URL列表中,循環往復直至獲取到所有符合條件的URL,同時,將成功獲取到響應的頁面信息傳入至情報解析模塊中。本模塊的網絡請求流程如圖3所示,具體的流程步驟如下:

圖3 頁面請求流程
(1)步驟1:在一個站點內選取一個URL鏈接作為數據采集程序的初始化種子URL,該URL可為網站一級URL,也可為下一級版塊URL。由于本文采用深度優先采集策略,優先選擇網站二級版塊URL作為初始化種子URL。
(2)步驟2:采集程序開始執行對URL的請求,獲取對應的響應信息。
(3)步驟3:采集程序對URL響應的頁面進行采集。
(4)步驟4:提取網頁上的所有URL鏈接,獲取頁面下新的URL鏈接。
(5)步驟5:判斷獲取的URL鏈接是否符合所需采集URL條件,若滿足條件,則將新的URL放入待采集URL隊列,繼續執行URL的請求,同時將該URL的響應內容傳入情報解析模塊。若不滿足條件,則結束頁面請求流程。
本文在測試階段所構建的網站集群包含站點如表2所示。

表2 采集站點列表
本系統所構建的情報解析模塊主要功能為對采集程序請求到的網絡頁面進行解析以及對需要獲取的字段進行提取。由于每個站點的頁面結構不同,數據的渲染方式各異,因此在設計和編寫解析規則時需要具體站點具體分析,根據每個站點的結構特征來設計合適的解析規則,這也是在系統構建中最費時的地方。本文以世界防務關鍵詞匹配采集任務為例,闡述頁面的解析與字段的提取。
世界防務網站的采集策略為通過關鍵詞構建用于檢索的URL,對該URL發起請求從而獲取檢索結果的響應結果,再從檢索結果頁面出發,提取檢索結果的URL進行更深一層詳情頁面的請求,最終獲得詳情頁面的響應結果進行解析和字段提取。
3.2.1 頁面分析與解析
通過對世界防務網的URL進行訪問請求后,獲得檢索頁面的響應結果,利用Xpath從頁面響應的源碼中解析出各條檢索結果的詳情頁URL,進而能夠對詳情頁面發起請求,從而最終從詳情頁解析到需要的字段。檢索界面的響應結果和詳情頁面如圖4、圖5所示。

圖4 世界防務檢索結果頁面展示

圖5 世界防務詳情頁面展示
實現上述解析提取的關鍵代碼如下:

3.2.2 解析字段設計
以世界防務網站中的開源情報為抓取目標,在對頁面結構進行分析后,需要從中解析出的字段如表3所示。

表3 世界防務開源情報ITEM構成表
其中,post_id為某條信息在世界防務網站中的唯一標識ID,post_url為該條信息的訪問URL鏈接,title為該信息的標題名稱,category為該信息在世界防務所屬的分類信息,pub_date為該信息的發布時間,content為該信息正文詳細內容。
基于Scrapy框架開發的開源核情報采集程序,在對頁面的字段進行解析提取后,會轉入框架的PipeLine中進行下載和存儲,在世界防務案例中,僅能采集到以標題、URL、詳情內容等類的文本類字符串數據,因此在設計存儲業務邏輯時,將解析提取的字段存入本地Mysql數據庫的對應表中,并將該信息的詳細內容轉換為pdf文檔格式進行本地化存儲,以便閱讀與使用。
以世界防務為例,設計的數據庫存儲表結構如表4所示。

表4 數據庫中世界防務信息存儲表屬性
對于該表,前六個字段用于存儲從頁面中解析出來的字段,crawl_time屬性用于存儲信息采集入庫的時間,file_path用于存儲詳情內容轉換為pdf文件后的本地存儲位置的路徑信息。
本系統測試環節共從世界防務網站采集到包含“Nuclear”關鍵詞的數據1 188條,耗時6分鐘,采集后存儲至本地Mysql數據庫的數據如圖6所示。

圖6 世界防務采集數據存儲結果
本文基于Scrapy的開源核情報采集系統實現對站點集群內站點的核開源情報的采集,但在數據采集程序執行的過程中難免會因為各種問題造成執行的中斷,因此需要實現對數據采集程序運行狀態的實時監測,使得用戶通過可視化界面的方式對采集程序運行狀態的直觀監測。基于此,本系統基于ScrapydWeb框架完成相關編碼工作,實現通過用戶界面對采集程序運行狀態的監測。
為了提升對核開源情報的搜集效率,本文基于Scrapy技術構建了開源核情報采集系統。該系統具有頁面請求模塊、情報解析模塊、情報存儲模塊以及用戶界面模塊,在測試階段實現了對國際原子能機構、世界核新聞網、動力工程、世界防務以及中國核網這5個網站特定版塊的數據采集,采集數據完整,采集效率較高。在接下來的實驗與研究中,本系統還需要拓展對更多核開源情報網站的采集,并且不斷完善本系統功能,集成數據預處理、數據挖掘以及數據可視化等更多功能。