蘇藝航 徐海蛟 何佳蕾 楊振宇 王佳鵬


摘要:隨著移動時代的到來,只適配了電腦網頁、性能羸弱的校園教務系統,已經不能滿足學生們的移動查詢需求。為此,設計了一種基于網絡爬蟲的高實用性查詢系統。它首先通過Python爬蟲以HTTP(hypertext transport protocol)分析與模擬方法獲取校園教務系統的網頁數據,然后對網頁數據進行HTTP解析并定位以精確抽取目標校園數據,最后存入高速NoSQL數據庫以供快速查詢。通過課表獲取實例,驗證了該設計的可行性與有效性。
關鍵詞:網絡爬蟲;HTTP分析;模擬登陸;網絡反爬;Scrapy框架
中圖分類號:TP393? ? ? 文獻標識碼:A
文章編號:1009-3044(2019)17-0086-03
開放科學(資源服務)標識碼(OSID):
Abstract: With the advent of the mobile Internet era, only adapted to PC web pages, the conventional educational administration system with weak performance has been unable to meet the requirement of students mobile access. Therefore, a retrieval system with strong practicability is developed, which is based on Web crawler. First, through a python crawler, the HTTP (HyperText Transport Protocol) parsing and simulation login are leveraged to fetch the content of Web pages in an educational administration system. Then, the page content is parsed and the target campus data is precisely extracted. Finally, the campus data is persisted in a high-speed NoSQL database for fast query service. By design a case of curriculum timetable acquisition, the feasibility and validity of the proposed approach is demonstrated.
Key words: web crawler; HTTP parsing; simulation login; anti-web crawler; scrapy framework
1 背景
移動互聯網時代下,傳統B/S架構的校園教務系統向移動智能終端延伸勢在必行。為滿足同學們日常的教務查詢需求,實現一個高實用性的第三方移動查詢平臺是一個亟須的解決方案。網絡爬蟲技術為實現這種校園數據查詢系統提供了技術基礎。
網絡爬蟲是一類會按照一定的規則,自動地從互聯網中獲取信息的程序或腳本。按照系統結構和實現技術,可主要分為以下四種:通用網絡爬蟲、聚焦網絡爬蟲、增量式網絡爬蟲、深層網絡爬蟲[1],實際的爬蟲系統通常會將上述幾種技術搭配結合使用。對于聚焦網絡爬蟲,它是對網頁進行有目的性的爬取,而與目標無關的網頁和數據會被過濾掉,因此可使用聚焦網絡爬蟲技術實現校園數據的查詢獲取。
2 爬蟲設計思路
設計爬蟲程序的通常步驟為:爬取目標確定、HTTP請求分析與模擬、數據解析與定位、數據邏輯處理、數據高速儲存[2]。遵循該五步驟設計法,設計思路分述如下。
2.1 爬取目標確定
本步驟為開發爬蟲程序的首要步驟。相對于其他類型爬蟲,爬取目標的描述或定義對聚焦網絡爬蟲來說至關重要。爬取目標的描述和定義是確定如何制定網頁分析算法和網址搜索策略的基礎。聚焦爬蟲的工作流程較為復雜,只有清晰地制定好爬取規則,才能更合理地設計和開發出網絡爬蟲程序。
2.2 HTTP請求分析與模擬
實現HTTP請求[3],首先要實現一個支持HTTP各種請求方法(如GET、POST)的請求報文與相應的模型。然后還需要合理處理每個請求的請求頭。有時會出現即使請求數據是正確的,但仍被服務器拒絕訪問的情況。這是因為服務器會校驗請求頭,并對非正常的請求拒絕服務或彈出驗證碼等措施,這也是最常見的反爬蟲[4]手段。另外還需注意部分爬蟲需要保存Cookie信息,這是因為HTTP協議是無狀態的,用戶的登錄信息等會被保存到瀏覽器Cookie中。查詢系統需要對Cookie進行適當管理,以實現模擬瀏覽器請求。最后,在完備的查詢系統中,還需處理異常,如請求超時、非2XX響應碼的響應、請求重定向等。在網絡爬蟲實現上,可使用Python3[5]內置的網絡模塊urllib來實現,也可使用更人性化的第三方網絡模塊:Requests庫。
2.3 數據解析與定位
數據解析目的是將已下載響應網頁中的目標數據提取出來并解析成基本數據類型。通常,響應網頁文本類型為:HTML、XML和JSON,其中HTML文檔最常見。對于HTML和XML類型的文檔來說,最常見的數據解析方法是先將文檔轉換成樹形結構對象,然后通過XPath語法來提取相應數據。如果是HTML文檔,還可使用CSS選擇器語法來定位相關節點。在Python爬蟲開發中,常用解析工具包是Beautiful Soup(bs4)庫。而JSON文檔則是最容易處理的,可使用Python的JSON內置庫來將其反序列化成dict類型,于是就可以方便地提取其數據了。另外,可使用正則表達式來捕獲一些含有一定應用語義規則的字符串。Python中re內置庫提供了通過正則表達式捕獲所需目標字符串的功能,這加速了開發過程。
2.4 數據清洗與邏輯處理
這個處理步驟是將解析出來的原始HTML數據按照一定規則清洗、轉換成便于存儲或后續進行數據分析的數據。這一邏輯處理步驟與應用相關,不是必需的,或者說這一步驟多數不在網絡爬蟲程序中完成。
2.5 數據高速儲存
數據高速儲存是指將爬蟲程序獲取到的校園應用數據持久化存儲到磁盤中,這是爬蟲程序中數據的終點。一個通常的解決方案是:將解析好的目標數據寫入到數據庫或者將目標數據序列化成JSON或XML文檔寫入磁盤文件中。被持久化的校園數據,可提供給快速查詢服務而無須訪問校園教務系統。
在移動互聯網時代與Web 3.0[6]時代下,選擇什么類型的數據庫對基于Python爬蟲的查詢系統性能較重要。傳統的關系型數據庫系統如MySQL以完善的關系代數理論作為基礎,支持事務ACID特性,借助索引機制可實現高效的查詢,但是可擴展性較差,無法較好支持海量數據存儲、Web 2.0/3.0應用。新型的NoSQL數據庫系統[7]如MongoDB可支持超大規模數據存儲,較好支持高并發低延時的Web 2.0/3.0應用,但是缺乏數學理論基礎,復雜查詢性能不高,很難實現數據完整性約束。
3 爬蟲開發過程—以課表獲取為例
以我校教務系統課表查詢為例,講述基于Scrapy[8]異步爬蟲框架下的開發過程,重點給出爬蟲實現過程中的關鍵設計思想和核心代碼。
3.1 HTTP模擬登錄
獲取課表網頁需要驗證校園教務系統登錄,擬采用模擬登錄技術。當模擬登錄時,在每一次HTTP請求中保存用戶Cookie數據,Scrapy已提供相關處理函數。此外,模擬登錄還涉及請求頭處理、驗證碼輸入、隱藏表單字段輸入、頁面跳轉與重定向等四個關鍵步驟。
3.1.1 請求頭處理
如圖1所示,修改Scrapy項目中的settings.py文件,以設置請求頭Headers。通過設置請求頭,可防止服務器拒絕模擬登錄發出的HTTP請求。
3.1.2 驗證碼輸入
我校教務系統無須輸入驗證碼登錄,因此在實驗中無須處理驗證碼。對于傳統的驗證碼輸入,可使用谷歌Tesseract-OCR庫來識別;而對于最近較流行的滑動驗證碼輸入,可使用瀏覽器自動化框架Selenium來模擬鼠標在瀏覽器上的拖動操作,以此通過驗證。
3.1.3 隱藏表單字段輸入
通過使用Chrome瀏覽器的開發者工具,抓取到模擬登錄過程中關鍵的HTTP POST請求,發現其中有兩個非賬號非密碼的必填表單字段,在每次請求時都會變化,如圖2所示。通過查看HTTP響應的HTML文檔,發現這是兩個隱藏的input標簽中的值:tokens和stamp。對于這種隱藏字段,可請求一次登錄頁面,然后使用正則表達式來將其捕獲。
3.1.4 頁面跳轉與重定向
當提交了HTTP POST請求后,所得到的響應頁面會包含一個重定向網址URL。使用該URL重發一次HTTP GET請求,就可獲取登錄相關的用戶Cookie數據,并且會被重定向到我校教務系統的主頁。圖3給出了模擬登錄代碼,它首先獲取儲存在數據庫中的校園網賬號,然后保存用戶Cookie數據并把登錄賬號傳遞給回調函數,之后使用正則表達式捕獲模擬登錄頁面中的隱藏字段數據,最后使用正則表達式捕獲需要跳轉的教務系統URL以完成模擬登錄。
3.2 目標頁面獲取
完成模擬登錄后,就可成功獲取課表頁面了。在這個步驟中,僅需生成一個相應的Python Request對象,并把解析頁面數據的函數作為回調函數即可。相應代碼如圖4所示。
3.3 頁面數據解析
為解析并獲取目標課表數據,首先檢視課表網頁,然后使用HTML代碼工具分析目標數據的位置,最后使用CSS選擇器定位目標數據:整個課表數據在id為Table1的table標簽中。其中前兩個tr標簽的內容為課程表表頭,可將其拋棄。此外,檢視含課程信息的td標簽,發現它們都含有值為Center的align屬性。據此,可通過程序精確提取目標課表數據。圖5為提取課表數據的核心代碼。
3.4 課表數據儲存
在查詢實驗中,選擇MongoDB這種基于分布式存儲的高速NoSQL數據庫來儲存課表數據。其主要考慮是:1)許多校園數據獲取應用如查課選課,易產生課表查詢的高并發瞬時峰值,而MongoDB數據庫可支持大規模數據存儲并較好支持高并發低延時Web查詢;2)通用校園數據獲取應用的復雜度不高,對數據完整性約束要求不強,適于MongoDB這種新型的NoSQL數據庫系統。
圖6演示了將處理完的課程數據對象轉化成Item對象的代碼。然后,按照Python Scrapy處理框架約定,傳遞Item對象給類Pipeline處理。在Pipeline類中的process_item()方法中,編寫Item插入MongoDB數據庫的語句即可完成數據持久化以供快速查詢。
4 結束語
為改善傳統校園教務系統的查詢性能,設計了一種基于Python爬蟲技術的校園數據查詢系統,較好解決了快速、移動訪問的校園數據獲取問題。文中以課表數據獲取為實例,講解了爬蟲程序的設計與實現。類似地,還可開發課程成績獲取、校園卡消費記錄獲取以及圖書借閱信息獲取等網絡爬蟲,以實現多功能校園數據查詢系統。
參考文獻:
[1] 潘巧智, 張磊. 淺談大數據環境下基于python的網絡爬蟲技術[J]. 網絡安全技術與應用, 2018(5): 41-42.
[2] 魏程程. 基于Python的數據信息爬蟲技術[J]. 電子世界, 2018(11): 208-209.
[3] 路輝, 高尚飛, 李少龍. 基于HTTP協議的業務系統網頁數據采集應用集成[J]. 電子技術與軟件工程, 2019(2): 1-3.
[4] 劉洋. 基于網頁瀏覽行為的反爬蟲研究[J]. 現代計算機: 專業版, 2019(7): 58-60.
[5] 吳劍冰. 基于Python3爬蟲獲取最新上架圖書的實現[J]. 電腦編程技巧與維護, 2018(4): 31-33.
[6] 劉鵬. Web3.0環境下的數據庫設計及程序開發[J]. 信息與電腦: 理論版, 2018(3): 124-126.
[7] 宋俊蘇. 大數據環境下基于NoSQL數據庫的查詢技術研究與應用[J]. 電腦編程技巧與維護, 2019(2): 76-77.
[8] 韓貝, 馬明棟, 王得玉. 基于Scrapy框架的爬蟲和反爬蟲研究[J]. 計算機技術與發展, 2019(2): 139-142.
【通聯編輯:謝媛媛】