◆郭慧珍 劉雨澤 梁燁文 王 哲 宋佳音
面向民航售票網站的實時爬蟲系統的設計與實現
◆郭慧珍 劉雨澤 梁燁文 王 哲 宋佳音
(中國民航大學計算機科學與技術學院 天津 300300)
近年來,隨著互聯網、大數據、信息化以及電子商務等計算機技術相關領域日新月異的發展,互聯網上存在著大量的可利用的有效信息。隨著這些技術的發展,爬蟲技術也得到了廣泛的應用而快速發展,實現了有效信息快速高效的采集和整合,本文介紹了面向民航售票網站的實時爬蟲系統的設計與實現,供讀者參考。
網絡爬蟲;Scrapy框架;MongoDB數據庫
隨著我國綜合國力和人們生活水平的提高,飛機已經成為人們重要的出行方式之一。但是不同于傳統的鐵路運輸方式,很多時候航空公司會提供價格較低的機票,以促進銷售額或為旅客提供性價比更高的服務。但是大多數時候,機票信息紛繁復雜,旅客無法準確及時獲取打折機票的信息。顯然,如何及時有效的整理當前折扣機票,為旅客提供更為直觀、有效的購票信息閱覽體驗成為值得探索的話題。因此,實現信息獲取和整合是我們要完成的主要任務。網絡爬蟲是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本,它們被廣泛用于互聯網搜索引擎或其他類似網站,可以自動采集所有其能夠訪問到的頁面內容,以獲取或更新這些網站的內容和檢索方式。
為了提高系統的效率,同時對多個任務加以控制,在同一時間需要完成多項任務,本系統中使用Scrapy框架來實現多線程。Scrapy是用純Python實現一個為了爬取網站數據、提取結構性數據而編寫的應用框架。Scrapy使用了 Twisted異步網絡框架來處理網絡通訊,可以加快我們的下載速度,不用自己去實現異步框架,并且包含了各種中間件接口,可以靈活完成各種需求[1]。
Splash是Scrapy官方推薦的JavaScript渲染,它是使用WebKit開發的輕量級無界面瀏覽器,提供基于HTTP接口的JavaScript渲染服務。XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。本系統中,依次,使用Splash渲染技術和xpath提取全部需要的機票相關的數據內容。使用Splash渲染技術,對需要獲取到的票價等機票數據進行分析,當頁面加載完成時需要的機票數據可以被加載出來。下一步,使用XPath提取頁面的信息,以航空公司名稱為例在谷歌瀏覽器使用XPath進行初步提取[2]。
MongoDB是NoSQL(非關系型數據庫)中的一類文檔型數據庫,其數據存儲方式靈活。MongoDB也很好地實現了面向對象的思想,在MongoDB中,每一條記錄都是一個Document對象。MongoDB最大的優勢在于所有的數據持久操作都無須開發人員手動編寫SQL語句,直接調用方法就可輕松實現CRUD操作。MongoDB是本系統中的數據存儲核心,所有爬取的數據都存放在這個數據庫中。將爬蟲爬取到的數據存入到數據庫后,將MongoDB數據庫連接到網頁頁面,根據用戶的輸入需求在頁面上顯示出用戶查找的機票信息,同時用戶可以使用機票的篩選、機票預訂等功能[3]。
系統劃分為網頁分析與數據提取、多線程爬蟲的實現、數據庫存儲、網頁實現四個模塊。其中,網頁分析與數據提取完成的功能是分析并且從網絡中抓取需要的信息;由于機票數據是實時更新的,進而會使用分布式爬取以及定時更新,需要實現多線程爬蟲;從網絡上抓取到我們需要的機票數據節后,需要將數據進行存儲,以方便用戶在填入需要查詢的機票信息時,系統可以從數據庫調度信息反饋給用戶的需求,在系統中加入數據庫存儲模塊;最后,為方便用戶操作以及經過一系列的處理后,系統可以向用戶反饋需要的信息,加入了網頁實現這一模塊。
通過分析,本項目需要爬的數據有航空公司、起始地、目的地、艙位信息、起飛時間、票價信息等內容。編寫爬蟲文件:在系統自動生成文件時,文件中已經設置好的爬蟲的唯一“name”,允許爬取的域名以及初始爬取頁面“start_urls”,文件中的parse方法是用來處理用來處理和抓取數據[4]。

圖1 爬蟲設計圖

圖2 Scrapy框架流程圖
首先爬蟲將需要發送請求的url(requests)經引擎交給調度器;排序處理后,經ScrapyEngine, DownloaderMiddlewares(有User_Agent, Proxy代理)交給Downloader;Downloader向互聯網發送請求,并接收下載響應。將響應經ScrapyEngine,可選交給Spiders;Spiders處理response,提取數據并將數據經ScrapyEngine交給ItemPipeline保存;提取url重新經ScrapyEngine交給Scheduler進行下一個循環,直到無Url請求程序停止結束[5]。
為了使機票信息能夠展現給用戶,將爬取到的數據內容全部存入MongoDB數據庫中。使用pymongo第三方包,完成MongoDB數據庫的相關配置,即可將爬蟲爬取到的數據存入到數據庫中,MongoDB數據庫的存儲圖3所示。

圖3 MongoDB數據庫存儲
分布式采用主從結構設置一個Master服務器和多個Slave服務器,Master端管理Redis數據庫和分發下載任務,Slave部署Scrapy爬蟲提取網頁和解析提取數據,最后將解析的數據存儲在同一個MongoDB據庫中,分布式爬蟲架構圖4所示。

圖4 分布式爬蟲構架圖
應用Redis數據庫實現分布式抓取,基本思想是Scrapy爬蟲獲取的到的detail_request的urls都放到Redis Queue中,所有爬蟲也都從指定的Redis Queue中獲取requests,Scrapy-Redis組件中默認使用SpiderPriorityQueue來確定url的先后次序,這是由sorted set實現的一種非FIFO、LIFO方式。因此,待爬隊列的共享是爬蟲可以部署在其他服務器上完成同一個爬取任務的一個關鍵點。此外,在本文中,為了解決Scrapy單機局限的問題,Scrapy將結合Scrapy-Redis組件進行開發,Scrapy-Redis總體思路就是這個工程通過重寫Scrapy框架中的scheduler和spider類,實現了調度、Spider啟動和Redis的交互。實現新的dupefilter和queue類,達到了判重和調度容器和redis的交互,因為每個主機上的爬蟲進程都訪問同一個Redis數據庫,所以調度和判重都統一進行統一管理,達到了分布式爬蟲的目的。
分布式爬蟲問題簡言之就是多臺機器多個 Spider 對多個 url 的同時處理問題,怎樣schedule 這些 url,怎樣匯總 spider 抓取的數據。思路就是把 url 存在某個地方,共享給所有的機器,總的調度器來分配請求,判斷 Spider 有沒有閑置,閑置了就繼續給它任務,直到所有的 url 都爬完,這種方法解決了去重問題,也能提高性能,Scrapy-Redis 就實現了這樣一個完整框架,總的來說,這更適合廣度優先的爬取。結合web和數據庫知識,建立網頁和數據庫,為用戶一套提供完整的實時性高的分布式爬蟲系統[6]。
以驢媽媽旅游網為例,該系統需要獲取到相關的機票數據有:航空公司、航班號、起飛降落時間、航站樓信息、票價等。接下來,對需要獲取到的機票數據進行分析,使用Splash渲染技術,當頁面加載完成時需要的機票數據可以被加載出來。下一步,使用XPath提取頁面的信息,以航空公司名稱為例在Chrome瀏覽器使用XPath進行初步提取,如圖6所示,可以提取到航空公司的信息。依次,使用Splash渲染技術和XPath提取全部需要的機票相關的數據內容。

圖6 xpath提取數據圖
頁面分析與數據提取完成以后,將需要提取的數據寫入項目的items.py文件,完成settings文件中相關的配置以及完成項目中數據提取的爬蟲文件。項目已初步完成,運行該爬蟲查看爬取的結果,如圖7所示。但是由于機票數據是實時更新的,進而會使用分布式爬蟲以及定時更新,將用戶的需求加入URL隊列進行爬取,并且使用Linux下的crontab命令完成定時爬取數據。
為了使機票信息能夠展現給用戶,將爬取到的數據內容全部存入MongoDB數據庫中。完成爬蟲爬取以后,將爬取到的數據存入到數據庫中。在MongoDB數據庫中,存入的數據如圖8所示。

圖7 部分爬取數據圖

圖8 MongoDB數據庫存儲圖
數據存入數據庫后,要將數據通過網頁的形式展現給使用方。將MongoDB數據庫連接到網頁頁面,根據用戶的輸入需求在頁面上顯示出用戶查找的機票信息以及訂該票的網站,同時用戶可以使用機票的篩選、跳轉預訂機票網站等功能。
本次面向民航網站的爬蟲系統的設計與實現中通過Python語言+Scrapy框架、Splash渲染、MongoDB數據庫和Web技術等實現了分布式爬蟲。基本能夠實現對當前折扣機票等信息的整理,為旅客提供更為直觀、有效的購票信息閱覽體驗。
[1]劉碩.精通Scrapy網絡爬蟲[M].清華大學出版社,2018.
[2]https://www.jianshu.com/p/4052926bc12c.
[3]李典桐.用于機票預訂的垂直搜索引擎的設計與實現[D].云南大學,2015.
[4]李琳.基于Python的網絡爬蟲系統的設計與實現[J].信息通信,2017,(09):26-27.
[5]王芳,張睿,宮海瑞.基于Scrapy框架的分布式爬蟲設計與實現[J].信息技術,2019(03):96-10.
[6]華云彬,匡芳君.基于Scrapy框架的分布式網絡爬蟲的研究與實現[J].智能計算機與應用,2018,8(05):46-50.
面向民航售票網站的爬蟲系統設計與實現(編號:IECAUC2018015)。