蘇藝航 徐海蛟 何佳蕾 楊振宇 王佳鵬
摘要:隨著移動(dòng)時(shí)代的到來,只適配了電腦網(wǎng)頁、性能羸弱的校園教務(wù)系統(tǒng),已經(jīng)不能滿足學(xué)生們的移動(dòng)查詢需求。為此,設(shè)計(jì)了一種基于網(wǎng)絡(luò)爬蟲的高實(shí)用性查詢系統(tǒng)。它首先通過Python爬蟲以HTTP(hypertext transport protocol)分析與模擬方法獲取校園教務(wù)系統(tǒng)的網(wǎng)頁數(shù)據(jù),然后對(duì)網(wǎng)頁數(shù)據(jù)進(jìn)行HTTP解析并定位以精確抽取目標(biāo)校園數(shù)據(jù),最后存入高速NoSQL數(shù)據(jù)庫以供快速查詢。通過課表獲取實(shí)例,驗(yàn)證了該設(shè)計(jì)的可行性與有效性。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;HTTP分析;模擬登陸;網(wǎng)絡(luò)反爬;Scrapy框架
中圖分類號(hào):TP393? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)17-0086-03
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(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 背景
移動(dòng)互聯(lián)網(wǎng)時(shí)代下,傳統(tǒng)B/S架構(gòu)的校園教務(wù)系統(tǒng)向移動(dòng)智能終端延伸勢(shì)在必行。為滿足同學(xué)們?nèi)粘5慕虅?wù)查詢需求,實(shí)現(xiàn)一個(gè)高實(shí)用性的第三方移動(dòng)查詢平臺(tái)是一個(gè)亟須的解決方案。網(wǎng)絡(luò)爬蟲技術(shù)為實(shí)現(xiàn)這種校園數(shù)據(jù)查詢系統(tǒng)提供了技術(shù)基礎(chǔ)。
網(wǎng)絡(luò)爬蟲是一類會(huì)按照一定的規(guī)則,自動(dòng)地從互聯(lián)網(wǎng)中獲取信息的程序或腳本。按照系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)技術(shù),可主要分為以下四種:通用網(wǎng)絡(luò)爬蟲、聚焦網(wǎng)絡(luò)爬蟲、增量式網(wǎng)絡(luò)爬蟲、深層網(wǎng)絡(luò)爬蟲[1],實(shí)際的爬蟲系統(tǒng)通常會(huì)將上述幾種技術(shù)搭配結(jié)合使用。對(duì)于聚焦網(wǎng)絡(luò)爬蟲,它是對(duì)網(wǎng)頁進(jìn)行有目的性的爬取,而與目標(biāo)無關(guān)的網(wǎng)頁和數(shù)據(jù)會(huì)被過濾掉,因此可使用聚焦網(wǎng)絡(luò)爬蟲技術(shù)實(shí)現(xiàn)校園數(shù)據(jù)的查詢獲取。
2 爬蟲設(shè)計(jì)思路
設(shè)計(jì)爬蟲程序的通常步驟為:爬取目標(biāo)確定、HTTP請(qǐng)求分析與模擬、數(shù)據(jù)解析與定位、數(shù)據(jù)邏輯處理、數(shù)據(jù)高速儲(chǔ)存[2]。遵循該五步驟設(shè)計(jì)法,設(shè)計(jì)思路分述如下。
2.1 爬取目標(biāo)確定
本步驟為開發(fā)爬蟲程序的首要步驟。相對(duì)于其他類型爬蟲,爬取目標(biāo)的描述或定義對(duì)聚焦網(wǎng)絡(luò)爬蟲來說至關(guān)重要。爬取目標(biāo)的描述和定義是確定如何制定網(wǎng)頁分析算法和網(wǎng)址搜索策略的基礎(chǔ)。聚焦爬蟲的工作流程較為復(fù)雜,只有清晰地制定好爬取規(guī)則,才能更合理地設(shè)計(jì)和開發(fā)出網(wǎng)絡(luò)爬蟲程序。
2.2 HTTP請(qǐng)求分析與模擬
實(shí)現(xiàn)HTTP請(qǐng)求[3],首先要實(shí)現(xiàn)一個(gè)支持HTTP各種請(qǐng)求方法(如GET、POST)的請(qǐng)求報(bào)文與相應(yīng)的模型。然后還需要合理處理每個(gè)請(qǐng)求的請(qǐng)求頭。有時(shí)會(huì)出現(xiàn)即使請(qǐng)求數(shù)據(jù)是正確的,但仍被服務(wù)器拒絕訪問的情況。這是因?yàn)榉?wù)器會(huì)校驗(yàn)請(qǐng)求頭,并對(duì)非正常的請(qǐng)求拒絕服務(wù)或彈出驗(yàn)證碼等措施,這也是最常見的反爬蟲[4]手段。另外還需注意部分爬蟲需要保存Cookie信息,這是因?yàn)镠TTP協(xié)議是無狀態(tài)的,用戶的登錄信息等會(huì)被保存到瀏覽器Cookie中。查詢系統(tǒng)需要對(duì)Cookie進(jìn)行適當(dāng)管理,以實(shí)現(xiàn)模擬瀏覽器請(qǐng)求。最后,在完備的查詢系統(tǒng)中,還需處理異常,如請(qǐng)求超時(shí)、非2XX響應(yīng)碼的響應(yīng)、請(qǐng)求重定向等。在網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)上,可使用Python3[5]內(nèi)置的網(wǎng)絡(luò)模塊urllib來實(shí)現(xiàn),也可使用更人性化的第三方網(wǎng)絡(luò)模塊:Requests庫。
2.3 數(shù)據(jù)解析與定位
數(shù)據(jù)解析目的是將已下載響應(yīng)網(wǎng)頁中的目標(biāo)數(shù)據(jù)提取出來并解析成基本數(shù)據(jù)類型。通常,響應(yīng)網(wǎng)頁文本類型為:HTML、XML和JSON,其中HTML文檔最常見。對(duì)于HTML和XML類型的文檔來說,最常見的數(shù)據(jù)解析方法是先將文檔轉(zhuǎn)換成樹形結(jié)構(gòu)對(duì)象,然后通過XPath語法來提取相應(yīng)數(shù)據(jù)。如果是HTML文檔,還可使用CSS選擇器語法來定位相關(guān)節(jié)點(diǎn)。在Python爬蟲開發(fā)中,常用解析工具包是Beautiful Soup(bs4)庫。而JSON文檔則是最容易處理的,可使用Python的JSON內(nèi)置庫來將其反序列化成dict類型,于是就可以方便地提取其數(shù)據(jù)了。另外,可使用正則表達(dá)式來捕獲一些含有一定應(yīng)用語義規(guī)則的字符串。Python中re內(nèi)置庫提供了通過正則表達(dá)式捕獲所需目標(biāo)字符串的功能,這加速了開發(fā)過程。
2.4 數(shù)據(jù)清洗與邏輯處理
這個(gè)處理步驟是將解析出來的原始HTML數(shù)據(jù)按照一定規(guī)則清洗、轉(zhuǎn)換成便于存儲(chǔ)或后續(xù)進(jìn)行數(shù)據(jù)分析的數(shù)據(jù)。這一邏輯處理步驟與應(yīng)用相關(guān),不是必需的,或者說這一步驟多數(shù)不在網(wǎng)絡(luò)爬蟲程序中完成。
2.5 數(shù)據(jù)高速儲(chǔ)存
數(shù)據(jù)高速儲(chǔ)存是指將爬蟲程序獲取到的校園應(yīng)用數(shù)據(jù)持久化存儲(chǔ)到磁盤中,這是爬蟲程序中數(shù)據(jù)的終點(diǎn)。一個(gè)通常的解決方案是:將解析好的目標(biāo)數(shù)據(jù)寫入到數(shù)據(jù)庫或者將目標(biāo)數(shù)據(jù)序列化成JSON或XML文檔寫入磁盤文件中。被持久化的校園數(shù)據(jù),可提供給快速查詢服務(wù)而無須訪問校園教務(wù)系統(tǒng)。
在移動(dòng)互聯(lián)網(wǎng)時(shí)代與Web 3.0[6]時(shí)代下,選擇什么類型的數(shù)據(jù)庫對(duì)基于Python爬蟲的查詢系統(tǒng)性能較重要。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫系統(tǒng)如MySQL以完善的關(guān)系代數(shù)理論作為基礎(chǔ),支持事務(wù)ACID特性,借助索引機(jī)制可實(shí)現(xiàn)高效的查詢,但是可擴(kuò)展性較差,無法較好支持海量數(shù)據(jù)存儲(chǔ)、Web 2.0/3.0應(yīng)用。新型的NoSQL數(shù)據(jù)庫系統(tǒng)[7]如MongoDB可支持超大規(guī)模數(shù)據(jù)存儲(chǔ),較好支持高并發(fā)低延時(shí)的Web 2.0/3.0應(yīng)用,但是缺乏數(shù)學(xué)理論基礎(chǔ),復(fù)雜查詢性能不高,很難實(shí)現(xiàn)數(shù)據(jù)完整性約束。
3 爬蟲開發(fā)過程—以課表獲取為例
以我校教務(wù)系統(tǒng)課表查詢?yōu)槔v述基于Scrapy[8]異步爬蟲框架下的開發(fā)過程,重點(diǎn)給出爬蟲實(shí)現(xiàn)過程中的關(guān)鍵設(shè)計(jì)思想和核心代碼。
3.1 HTTP模擬登錄
獲取課表網(wǎng)頁需要驗(yàn)證校園教務(wù)系統(tǒng)登錄,擬采用模擬登錄技術(shù)。當(dāng)模擬登錄時(shí),在每一次HTTP請(qǐng)求中保存用戶Cookie數(shù)據(jù),Scrapy已提供相關(guān)處理函數(shù)。此外,模擬登錄還涉及請(qǐng)求頭處理、驗(yàn)證碼輸入、隱藏表單字段輸入、頁面跳轉(zhuǎn)與重定向等四個(gè)關(guān)鍵步驟。
3.1.1 請(qǐng)求頭處理
如圖1所示,修改Scrapy項(xiàng)目中的settings.py文件,以設(shè)置請(qǐng)求頭Headers。通過設(shè)置請(qǐng)求頭,可防止服務(wù)器拒絕模擬登錄發(fā)出的HTTP請(qǐng)求。
3.1.2 驗(yàn)證碼輸入
我校教務(wù)系統(tǒng)無須輸入驗(yàn)證碼登錄,因此在實(shí)驗(yàn)中無須處理驗(yàn)證碼。對(duì)于傳統(tǒng)的驗(yàn)證碼輸入,可使用谷歌Tesseract-OCR庫來識(shí)別;而對(duì)于最近較流行的滑動(dòng)驗(yàn)證碼輸入,可使用瀏覽器自動(dòng)化框架Selenium來模擬鼠標(biāo)在瀏覽器上的拖動(dòng)操作,以此通過驗(yàn)證。
3.1.3 隱藏表單字段輸入
通過使用Chrome瀏覽器的開發(fā)者工具,抓取到模擬登錄過程中關(guān)鍵的HTTP POST請(qǐng)求,發(fā)現(xiàn)其中有兩個(gè)非賬號(hào)非密碼的必填表單字段,在每次請(qǐng)求時(shí)都會(huì)變化,如圖2所示。通過查看HTTP響應(yīng)的HTML文檔,發(fā)現(xiàn)這是兩個(gè)隱藏的input標(biāo)簽中的值:tokens和stamp。對(duì)于這種隱藏字段,可請(qǐng)求一次登錄頁面,然后使用正則表達(dá)式來將其捕獲。
3.1.4 頁面跳轉(zhuǎn)與重定向
當(dāng)提交了HTTP POST請(qǐng)求后,所得到的響應(yīng)頁面會(huì)包含一個(gè)重定向網(wǎng)址URL。使用該URL重發(fā)一次HTTP GET請(qǐng)求,就可獲取登錄相關(guān)的用戶Cookie數(shù)據(jù),并且會(huì)被重定向到我校教務(wù)系統(tǒng)的主頁。圖3給出了模擬登錄代碼,它首先獲取儲(chǔ)存在數(shù)據(jù)庫中的校園網(wǎng)賬號(hào),然后保存用戶Cookie數(shù)據(jù)并把登錄賬號(hào)傳遞給回調(diào)函數(shù),之后使用正則表達(dá)式捕獲模擬登錄頁面中的隱藏字段數(shù)據(jù),最后使用正則表達(dá)式捕獲需要跳轉(zhuǎn)的教務(wù)系統(tǒng)URL以完成模擬登錄。
3.2 目標(biāo)頁面獲取
完成模擬登錄后,就可成功獲取課表頁面了。在這個(gè)步驟中,僅需生成一個(gè)相應(yīng)的Python Request對(duì)象,并把解析頁面數(shù)據(jù)的函數(shù)作為回調(diào)函數(shù)即可。相應(yīng)代碼如圖4所示。
3.3 頁面數(shù)據(jù)解析
為解析并獲取目標(biāo)課表數(shù)據(jù),首先檢視課表網(wǎng)頁,然后使用HTML代碼工具分析目標(biāo)數(shù)據(jù)的位置,最后使用CSS選擇器定位目標(biāo)數(shù)據(jù):整個(gè)課表數(shù)據(jù)在id為Table1的table標(biāo)簽中。其中前兩個(gè)tr標(biāo)簽的內(nèi)容為課程表表頭,可將其拋棄。此外,檢視含課程信息的td標(biāo)簽,發(fā)現(xiàn)它們都含有值為Center的align屬性。據(jù)此,可通過程序精確提取目標(biāo)課表數(shù)據(jù)。圖5為提取課表數(shù)據(jù)的核心代碼。
3.4 課表數(shù)據(jù)儲(chǔ)存
在查詢實(shí)驗(yàn)中,選擇MongoDB這種基于分布式存儲(chǔ)的高速NoSQL數(shù)據(jù)庫來儲(chǔ)存課表數(shù)據(jù)。其主要考慮是:1)許多校園數(shù)據(jù)獲取應(yīng)用如查課選課,易產(chǎn)生課表查詢的高并發(fā)瞬時(shí)峰值,而MongoDB數(shù)據(jù)庫可支持大規(guī)模數(shù)據(jù)存儲(chǔ)并較好支持高并發(fā)低延時(shí)Web查詢;2)通用校園數(shù)據(jù)獲取應(yīng)用的復(fù)雜度不高,對(duì)數(shù)據(jù)完整性約束要求不強(qiáng),適于MongoDB這種新型的NoSQL數(shù)據(jù)庫系統(tǒng)。
圖6演示了將處理完的課程數(shù)據(jù)對(duì)象轉(zhuǎn)化成Item對(duì)象的代碼。然后,按照Python Scrapy處理框架約定,傳遞Item對(duì)象給類Pipeline處理。在Pipeline類中的process_item()方法中,編寫Item插入MongoDB數(shù)據(jù)庫的語句即可完成數(shù)據(jù)持久化以供快速查詢。
4 結(jié)束語
為改善傳統(tǒng)校園教務(wù)系統(tǒng)的查詢性能,設(shè)計(jì)了一種基于Python爬蟲技術(shù)的校園數(shù)據(jù)查詢系統(tǒng),較好解決了快速、移動(dòng)訪問的校園數(shù)據(jù)獲取問題。文中以課表數(shù)據(jù)獲取為實(shí)例,講解了爬蟲程序的設(shè)計(jì)與實(shí)現(xiàn)。類似地,還可開發(fā)課程成績(jī)獲取、校園卡消費(fèi)記錄獲取以及圖書借閱信息獲取等網(wǎng)絡(luò)爬蟲,以實(shí)現(xiàn)多功能校園數(shù)據(jù)查詢系統(tǒng)。
參考文獻(xiàn):
[1] 潘巧智, 張磊. 淺談大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲技術(shù)[J]. 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用, 2018(5): 41-42.
[2] 魏程程. 基于Python的數(shù)據(jù)信息爬蟲技術(shù)[J]. 電子世界, 2018(11): 208-209.
[3] 路輝, 高尚飛, 李少龍. 基于HTTP協(xié)議的業(yè)務(wù)系統(tǒng)網(wǎng)頁數(shù)據(jù)采集應(yīng)用集成[J]. 電子技術(shù)與軟件工程, 2019(2): 1-3.
[4] 劉洋. 基于網(wǎng)頁瀏覽行為的反爬蟲研究[J]. 現(xiàn)代計(jì)算機(jī): 專業(yè)版, 2019(7): 58-60.
[5] 吳劍冰. 基于Python3爬蟲獲取最新上架圖書的實(shí)現(xiàn)[J]. 電腦編程技巧與維護(hù), 2018(4): 31-33.
[6] 劉鵬. Web3.0環(huán)境下的數(shù)據(jù)庫設(shè)計(jì)及程序開發(fā)[J]. 信息與電腦: 理論版, 2018(3): 124-126.
[7] 宋俊蘇. 大數(shù)據(jù)環(huán)境下基于NoSQL數(shù)據(jù)庫的查詢技術(shù)研究與應(yīng)用[J]. 電腦編程技巧與維護(hù), 2019(2): 76-77.
[8] 韓貝, 馬明棟, 王得玉. 基于Scrapy框架的爬蟲和反爬蟲研究[J]. 計(jì)算機(jī)技術(shù)與發(fā)展, 2019(2): 139-142.
【通聯(lián)編輯:謝媛媛】