伍高巍 劉杰 葛曉龍 徐望成



摘要:研招網作為中國最大的研究生招考信息公布平臺,資源豐富。目前主流的爬蟲框架有Scrapy、pyspider與crawley,其中Scrapy為目前最流行的爬蟲框架。因此,文中主要研究Python語言開發的開源爬蟲框架Scrapy所開發的爬蟲,對研招網碩士目錄進行爬取,舉例說明爬蟲如何應對網站的反爬措施。
關鍵詞:網絡爬蟲;Scrapy;Python;反反爬;研招網
中圖分類號:TP311.11? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)17-0053-03
1 引言
隨著信息技術與互聯網的發展,人們幾乎在生活中每時每刻都在產生著數據也不斷在獲取數據,但是由于互聯網的網狀結構是數據零零散散地發布在不同的區域,很難實現數據系統化結構化的有效利用。人們繼續采用以往的常規方式去收集數據的話,不僅速度慢而且效率低,由此網絡爬蟲技術就誕生了。網絡爬蟲可以通過分析網頁的基本結構及其特點,通過相關選擇器從而獲取網站的指定信息。
研招網(yz.chsi.com.cn)是教育部全國碩士研究生招生考試網上報名和網上調劑指定網站,貫穿研究生招生宣傳、招生咨詢、報名管理、生源調劑、錄取檢查整個工作流程,實現了研究生招生信息管理一體化。
2 Scrapy爬蟲設計
研招網碩士碩士目錄(https://yz.chsi.com.cn/zsml/zyfx_search.jsp)提供了統一的按照學校、學科門類、學科類別等查詢方式,為廣大考生提供了許多年的優質服務,但是由于不同院校的考試科目千差萬別,這導致無法按照考試科目進行查找相關院校成為了一大難題。我國具有招收研究生資格的院校往往都會在研招網上公布其當年統考的招生人數以及考試課程,其中考試課程也分為統考科目與院校自主命題。為了更好地解決研究生考試擇校問題,本文對研招網碩士目錄進行了相關信息的爬取。
2.1 爬取對象的分析
其中研招網碩士目錄主要分為四個頁面,第一個為搜索頁,第二個為目錄頁,第三個為院校頁,第四個為招考信息頁。
其中對研招網碩士目錄分析網頁請求結構,通過瀏覽器的檢查工具可知。首先由瀏覽器對https://yz.chsi.com.cn/zsml/queryAction.do發送post請求,并且攜帶的數據如表1所示。
mldm與yjxkdm為必須選項,例如請求南華大學軟件工程全日制學碩的招考信息則需要向https://yz.chsi.com.cn/zsml/queryAction.do?ssdm=43&dwmc=南華大學&mldm=08&mlmc=&yjxkdm=0835&xxfs=1&zymc=軟件工程 發起網絡請求,其中?后面攜帶的為post請求所需要發送的參數,通過其參數即可實現自定義查找。由此可以通過mldm=zyxw&yjxkdm=0854&xxfs=1 即可實現對全國所有招收全日制電子信息專業碩士的信息的查找。同理可以對下一頁的操作進行分析可以得知只需要攜帶一個pageno參數即可完成翻頁操作,如pageno=2即表示請求第二頁。
2.2 Scrapy概述
Python語言擁有許許多多的第三方爬蟲庫,如Scrapy、pyspider、crawley等[1]。其中Scrapy爬蟲框架應用最為廣泛。Scrapy框架采用Python語言設計而成,擁有twisted的特點,能夠很好地實現異步爬取網頁相關內容,快速而又十分便捷[2]。通過Scrapy爬蟲框架支持自定義中間件結構,從而實現對爬蟲數據的個性化處理。
2.3 Scrapy 基本架構
Scarpy由引擎、調度器、下載器、爬蟲、管道、下載中間件、爬蟲中間件七大部分組成[3]。其中各組件的作用如下:
1)引擎主要負責數據在Scrapy中的流動。
2)調度器主要負責處理來自引擎的請求。
3)下載器主要負責獲取網頁的信息并交給引擎進行處理。
4)爬蟲主要負責提取符合由開發者編寫的提取規則的字段。
5)管道主要負責對相關字段的處理。
6)下載中間件是位于下載器與引擎之間的結構,主要負責數據在引擎與下載器中間流動過程的處理。
7)爬蟲中間件是位于爬蟲與引擎之間的結構,主要負責數據在引擎流與爬蟲中間流動過程的處理。
2.4 爬蟲總體架構設計
本文將爬蟲分為三個模塊即網頁信息抓取模塊、中間件模塊以及數據處理模塊[4]。
網頁信息抓取模塊首先根據定義的URL地址分析網頁element結構,再根據由開發者自定義的XPath提取相關字段。
中間件模塊負責通過User-Agent偽裝,代理IP等技術實現反反爬。
數據處理模塊將對爬蟲爬取的數據進行相關處理,然后在MySQL數據庫中實現持久化存儲。
2.5 數據流控制
Scrapy對研招網碩士目錄數據流的控制如下:
1)引擎從爬蟲中獲得一個初始請求即start_url(目錄頁的url地址)。
2)爬蟲通過對字段的提取得到院校頁的url,并放入調度器中。
3)調度器將請求提交給引擎。
4)引擎通過下載中間件把相關請求提交給下載器處理。
5)下載器獲得相應的院校頁的響應數據,并提交給引擎處理。
6)引擎將來自下載器的數據經過爬蟲中間件提交給爬蟲處理。
7)爬蟲通過相關的提取規則得到招考信息頁的url,并放入調度器中。
8)調度器將請求提交給引擎。
9)引擎通過下載中間件把相關請求提交給下載器處理。
10)下載器獲得相應的招考信息頁的響應數據,并提交給引擎處理。
11)引擎將來自下載器的數據經過爬蟲中間件提交給爬蟲處理。
12)爬蟲爬取相關信息。
2.6 爬蟲字段的設計
設計爬取碩士目錄的學校名稱、學校所在地、招生院系、招生人數、考試科目、研究方向、指導老師、學科門類、學科類別、學習方式、招生專業、是否自劃線、是否擁有研究生院、是否擁有博士點。并采用Scrapy.Item的屬性定義在Items.py文件中。
2.7 爬蟲策略的設計
其中Scrapy爬蟲采用深度優先爬蟲策略[5]設計如下:
1)首先用戶自定義相關參數。
2)爬蟲獲取start_url。
3)分析當前頁的網頁結構與特點,根據用戶自定義爬取規則爬取當前目錄頁的相關數據。
4)跳轉至院校頁。
5)分析當前頁的網頁結構與特點,根據用戶自定義爬取規則爬取當前院校頁的相關數據。
6)跳轉至招考信息頁。
7)分析當前頁的網頁結構與特點,根據用戶自定義爬取規則爬取當前招考信息頁的相關數據。
8)將相關數據存入數據庫中。
9)返回院校頁。
10)判斷是否存在下一頁,若存在下一頁,則請求翻頁處理,并執行步驟5,直至不存在下一頁;若不存在下一頁,則返回目錄頁。
11)判斷是否存在下一頁,若存在下一頁,則請求翻頁處理,并執行步驟3,直至不存在下一頁;若不存在下一頁,則將數據導出為Excel文件,程序結束。
示意圖如圖2所示。
其中為了實現對網頁中相關信息的提取,文章選用了XPath作為選擇器,XPath是一個輕量級的小型查詢語言[6]。如需獲得院校頁的url地址,可通過使用response.xpath(‘//tbody/tr//a/@href)來對具體學校的URL地址進行提取。
2.8 反反爬策略的設計
由于研招網具有一定的反反爬能力,為了實現對網站的正常訪問采用隨機User-Agent偽裝以及IP代理的方式來規避服務器對爬蟲對封禁。
其中Scrapy默認攜帶的請求頭為爬蟲的請求頭,服務器可以對其識別,并進行封禁處理[7]。本文設計了一個User-Agent池,User-Agent池中含有大量的User-Agent請求頭,并且通過random模塊中的choice方法與自定義中間件UserAgentProxyMiddlerware來實現對爬蟲User-Agent的隨機偽裝,從而實現使服務器認為是瀏覽器發送的正常請求。
當同一個IP地址連續多次發送請求時,服務器也會認為此請求為爬蟲發出的,也會對其進行封禁處理[8]。為了規避服務器對爬蟲的封禁,采用了代理IP,通過每發送一次網絡請求,變更一次IP地址,從而使服務器認為是由多個來自不同的計算機對其發送的網絡請求。
2.9 持久化存儲
當完成一次數據提取后,為了對數據進行持久化存儲,由此選用了關系型數據庫MySQL,并采用pymysql模塊作為程序與數據庫連接的中間橋梁,通過編寫SQL語句進行對數據庫的操作。并通過DownloadMiddleWare中的open_spider方法與close_spider方法實現對數據庫的連接與斷開[9]。其中open_spider方法與close_spider方法在同一個爬蟲程序中有且僅執行一次。通過process_items方法將items存入MySQL數據庫中。
同時可以采用編寫SQL語句的方式完成對數據庫中信息進行相關查詢工作,或者通過利用pandas模塊,將數據庫內容導出為Excel文件進行查找或篩選。
3 結束語
本文通過設計了一個Scrapy爬蟲對研招網碩士目錄進行了相關信息的爬取,并進行了持久化存儲,支持使用SQL語句或者Excel來進行相關數據的查詢與篩選。可以使人們通過考試專業課對院校進行選擇。打破了研招網按學校查詢的思想,為考生提供了新的選擇。
參考文獻:
[1] 劉宇,鄭成煥.基于Scrapy的深層網絡爬蟲研究[J].軟件,2017,38(7):111-114.
[2] 孫瑜.基于Scrapy框架的網絡爬蟲系統的設計與實現[D].北京:北京交通大學,2019.
[3] Xie D X,Xia W F.Design and implementation of the topic-focused crawler based on scrapy[J].Advanced Materials Research,2013,850/851:487-490.
[4] 安子建.基于Scrapy框架的網絡爬蟲實現與數據抓取分析[D].長春:吉林大學,2017.
[5] 劉世濤.簡析搜索引擎中網絡爬蟲的搜索策略[J].阜陽師范學院學報(自然科學版),2006,23(3):59-62.
[6] 袁宇麗.基于HTML網頁的Web信息提取研究[D].成都:電子科技大學,2006.
[7] 陳輝.基于SCRAPY框架的網絡爬蟲封鎖技術破解研究[J].科技視界,2020(6):224-225.
[8] 韓貝,馬明棟,王得玉.基于Scrapy框架的爬蟲和反爬蟲研究[J].計算機技術與發展,2019,29(2):139-142.
[9] 鄭嵐.Python訪問MySQL數據庫[J].電腦編程技巧與維護,2010(6):59-61.
收稿日期:2022-03-16
基金項目:2020年湖南省大學生實踐創新訓練項目:校園東街微信小程序的設計與開發(項目編號:S202010555141)
作者簡介:伍高巍(2000—),男,湖南婁底人,本科在讀,主要研究方向為軟件工程、計算機視覺等;劉杰(1974—),男,湖南衡陽人,副教授,博士,研究方向為軟件工程、可信軟件等;葛曉龍(2000—),男,河南濮陽人,本科在讀,研究方向為軟件工程等;徐望成(2000—),男,湖南衡陽人,本科在讀,研究方向為軟件工程等。