鄧子云
(長沙商貿(mào)旅游職業(yè)技術(shù)學院 湘商學院,湖南 長沙 410116)
為能用大數(shù)據(jù)技術(shù)分析全國高等職業(yè)教育(以下簡稱“高職”)專業(yè)點布局的規(guī)律與存在的問題,需要先獲得全國高職專業(yè)點的設(shè)置數(shù)據(jù)。在全國職業(yè)院校專業(yè)設(shè)置管理與公共信息服務(wù)平臺(http://zyyxzy.moe.edu.cn)中,已經(jīng)收集了全國高職專業(yè)點設(shè)置的數(shù)據(jù)和專業(yè)名錄,該平臺中的數(shù)據(jù)面向互聯(lián)網(wǎng)公開。因此,可以設(shè)計出一種爬蟲來爬取這些數(shù)據(jù)。
爬蟲的架構(gòu)設(shè)計包括功能架構(gòu)和技術(shù)架構(gòu)兩個部分[1]。目前關(guān)于爬蟲的設(shè)計已有成熟穩(wěn)定的框架系統(tǒng),因此沒有必要再從技術(shù)底層開始全面開發(fā)爬蟲[2]??晒┻x擇的爬蟲框架系統(tǒng)有基于Java語言的Crawler4j[3]、基于Python語言的Scrapy[4]??紤]到后續(xù)作大數(shù)據(jù)處理仍然采用Python語言,且Python語言開發(fā)簡便、快捷,因此選用Scrapy作為爬蟲開發(fā)的框架[5]。
從功能需求出發(fā),結(jié)合Scrapy框架,應(yīng)當實現(xiàn)如圖1所示的功能:1.需要爬取專業(yè)設(shè)置點的數(shù)據(jù);2.需要爬取專業(yè)名錄數(shù)據(jù);3.需要對爬行過程中的異常作出處理;4.為應(yīng)對反爬蟲系統(tǒng)需要作爬蟲偽裝;5.將爬取的數(shù)據(jù)存儲到數(shù)據(jù)庫中;6.設(shè)計并實現(xiàn)高職專業(yè)數(shù)據(jù)庫系統(tǒng)。
圖1 爬蟲的功能架構(gòu)
爬蟲在爬取網(wǎng)站(http://zyyxzy.moe.edu.cn)的頁面數(shù)據(jù)后,用XPath表達式[6]從網(wǎng)頁中提取到專業(yè)點和專業(yè)名錄數(shù)據(jù),填充到數(shù)據(jù)項SpecialitiesItem和數(shù)據(jù)項SpecialitiyDictItem中,這兩個數(shù)據(jù)項分別表示專業(yè)點和專業(yè)名錄。再通過項目管道SpecialityDataPipeline將數(shù)據(jù)項中的數(shù)據(jù)存儲到數(shù)據(jù)庫的表中。
從技術(shù)架構(gòu)來看,Scrapy核心引擎、調(diào)度器、下載器、爬蟲的爬行功能在技術(shù)上不需要再行開發(fā)[7],利用Scrapy框架中已有的功能模塊即可。結(jié)合爬蟲的功能架構(gòu)和技術(shù)架構(gòu),還應(yīng)在技術(shù)上實現(xiàn)以下技術(shù)模塊(見圖2):
圖2 爬蟲的技術(shù)框架
1.高職專業(yè)數(shù)據(jù)庫
設(shè)計Specialities表、SpecialitiyDict表等的ER(Entity Relation)關(guān)系,并用SQL(Structed Query Language)語句完成表創(chuàng)建、記錄插入、記錄修改、記錄刪除等操作。數(shù)據(jù)庫采用了SQL Server 2017。
2.項目管道
項目管道(SpecialityData Pipline)用于封裝對數(shù)據(jù)庫的操作,在其中要設(shè)計并實現(xiàn)設(shè)置數(shù)據(jù)庫的連接參數(shù)、用連接池獲得數(shù)據(jù)連接、釋放數(shù)據(jù)庫連接、執(zhí)行SQL語句等功能[8]。
3.數(shù)據(jù)項
數(shù)據(jù)項(SpecialitiesItem和SpecialityDictItem)用于封裝由爬取到的數(shù)據(jù)構(gòu)成的數(shù)據(jù)結(jié)構(gòu),常用一個數(shù)據(jù)項來對應(yīng)數(shù)據(jù)庫中的一個表。
4.網(wǎng)站爬蟲
通過設(shè)定爬蟲(CrawlPages Spider)的爬取方向,可分別爬取專業(yè)設(shè)置點和專業(yè)名錄數(shù)據(jù)。
5.異常處理中間件
中間件(ExceptMiddeware)對Scrapy框架捕獲到的各種異常進行處理[9]。
6.偽裝中間件
中間件(AgentMiddeware)將爬蟲偽裝成各種瀏覽器爬取數(shù)據(jù)。
7.Scrapy配置
對Scrapy框架進行配置,主要配置項包括數(shù)據(jù)庫連接參數(shù)、異常處理中間件的類等[10]。
從前述分析來看,關(guān)鍵的兩個數(shù)據(jù)表是專業(yè)點設(shè)置表、專業(yè)名錄表,再看這些表中哪些數(shù)據(jù)可以作分類或用數(shù)值代替字符串,以降低存儲并提升數(shù)據(jù)的范式。為此,設(shè)計ER圖如圖3所示。
從圖3可以看出,數(shù)據(jù)庫中設(shè)計了6個表,表與表之間存在依賴關(guān)系。專業(yè)點表中記錄了編號、專業(yè)點設(shè)置的省份代碼,以及設(shè)置專業(yè)點的學校的代碼、專業(yè)代碼、專業(yè)學習年限、專業(yè)點備案年份等字段。專業(yè)點表通過專業(yè)代碼與專業(yè)名錄表關(guān)聯(lián),通過設(shè)置專業(yè)點的省份代碼與省份表關(guān)聯(lián),通過設(shè)置專業(yè)點的學校的代碼與學校表關(guān)聯(lián)。
圖3 ER圖
專業(yè)名錄表中的專業(yè)代碼可以拆分成大類、二級類和二級類中的專業(yè)編號,該表中還有專業(yè)名稱和開設(shè)年份字段。因此通過專業(yè)代碼可以關(guān)聯(lián)專業(yè)大類表、專業(yè)二級類表,一個專業(yè)二級類又屬于某一個專業(yè)大類。
根據(jù)圖3所示的設(shè)計思路,可設(shè)計出SQL Server 2017中的表,如表1所示。
表1 SQL Server 2017中表的實現(xiàn)
續(xù)表
根據(jù)前述技術(shù)架構(gòu)的設(shè)計,爬蟲還需要設(shè)計與實現(xiàn)項目管道、數(shù)據(jù)項、網(wǎng)站爬蟲、異常處理中間件、偽裝中間件,并對這些技術(shù)模塊作出配置。
在項目管理中可使用twisted.enterprise的adbapi模塊[11]來作數(shù)據(jù)庫的建立連接、關(guān)閉連接操作,以及執(zhí)行SQL語句(包括插入、增加、刪除、修改)操作。
應(yīng)在啟動爬蟲時建立數(shù)據(jù)庫連接池,代碼如下:
應(yīng)在關(guān)閉爬蟲時關(guān)閉數(shù)據(jù)庫連接池,代碼如下:
應(yīng)在項目管道收到數(shù)據(jù)項后,即可調(diào)用執(zhí)行插入數(shù)據(jù)庫數(shù)據(jù)的代碼:
數(shù)據(jù)項封裝了從網(wǎng)頁中爬取的數(shù)據(jù),并可用于通過項目管道操作數(shù)據(jù)庫中的數(shù)據(jù)[13]。為簡化起見,只需要設(shè)計實現(xiàn)2個數(shù)據(jù)項即可,即數(shù)據(jù)項SpecialitiesItem和數(shù)據(jù)項SpecialitiyDictItem。這兩個數(shù)據(jù)項的代碼如下:
為了爬取網(wǎng)站中的數(shù)據(jù),需要專門設(shè)計一個爬蟲類。這個爬蟲類中的代碼相對其他技術(shù)模塊的代碼較為復雜。
要爬取專業(yè)點的設(shè)置數(shù)據(jù),可分析其網(wǎng)址(http://zyyxzy.moe.edu.cn/mspMajorRegisterActi on.fo?method=index&startcount=100),如圖4所示。
圖4 要爬取數(shù)據(jù)的頁面
在網(wǎng)址中通過startcount參數(shù)表示當前頁的專業(yè)點數(shù)據(jù)的起始號,每頁顯示100條專業(yè)點數(shù)據(jù)。但還有年份參數(shù)是通過表單提交的。因此不僅要在網(wǎng)址中帶入每頁數(shù)據(jù)的起始號,還需要生成一個表單,在表單中設(shè)置專業(yè)備案的年份。
爬取2016—2020年專業(yè)點數(shù)據(jù)的代碼如下:
在返回數(shù)據(jù)項后,Scrapy框架會自動通過項目管道向數(shù)據(jù)庫中作數(shù)據(jù)操作。
要爬取專業(yè)名錄的數(shù)據(jù),相對爬取專業(yè)點的設(shè)置更為簡單。
在專業(yè)名錄網(wǎng)址(http://zyyxzy.moe.edu.cn/msp MajorGzAction.fo?method=list&startcount=100)中通過startcount參數(shù)表示當前頁的專業(yè)點數(shù)據(jù)的起始號,每頁顯示100條專業(yè)點數(shù)據(jù)。專業(yè)名錄的網(wǎng)頁無需用表單來提交數(shù)據(jù),也不需要傳入年份參數(shù)??紤]相對較為簡單,不再贅述和重復列出爬取專業(yè)名錄數(shù)據(jù)的源代碼。
爬取處理中間件的作用是及時捕獲異常并報錯,但并不中止爬蟲的運行。要處理的異常如下:
比較簡單的實現(xiàn)偽裝中間件的做法是用一個集合列出所有準備偽裝的瀏覽器的名稱:
然后再隨機的選擇其中的一個瀏覽器名稱,放入到請示頁面時的頭部中:
使用爬蟲爬取到了全國職業(yè)院校專業(yè)設(shè)置管理與公共信息服務(wù)平臺中2016—2020年的專業(yè)點設(shè)置數(shù)據(jù)和專業(yè)名錄數(shù)據(jù),其中專業(yè)點設(shè)置數(shù)據(jù)如圖5所示,總共爬取到275,873條專業(yè)點設(shè)置數(shù)據(jù)和770條專業(yè)名錄數(shù)據(jù)。
圖5 全國專業(yè)點的數(shù)量和增長率
以爬取的數(shù)據(jù)為基礎(chǔ),可以進一步開展全國專業(yè)點布局的大數(shù)據(jù)分析。下面給出兩個分析示例。
可根據(jù)爬取到的各省設(shè)置專業(yè)點的數(shù)量情況得出布局的一些明顯規(guī)律。其中,2020年全國形成了“三核一X”的形態(tài),即三個專業(yè)點核心圈為四川、廣東、四省(江蘇、安徽、山東、河南),一個“X”形狀的隔離帶把三個核心圈隔離開來。
經(jīng)大數(shù)據(jù)分析發(fā)現(xiàn)專業(yè)點數(shù)高度集中。排名前50名的專業(yè)的專業(yè)點數(shù)占所有專業(yè)的專業(yè)點總數(shù)的比例在2020年為50.97%,其中排名前10名的專業(yè)如表2所示。在2020年總共有779個專業(yè),前50名的專業(yè)的專業(yè)點數(shù)就超過了一半,6.42%的專業(yè)的專業(yè)點數(shù)占了所有專業(yè)點總數(shù)的50.97%。
表2 2020年點數(shù)排名前10名的專業(yè)
2020年,在779個專業(yè)中,全國有216個專業(yè)的專業(yè)點數(shù)低于或等于5個,這216個專業(yè)中有41個專業(yè)已沒有專業(yè)點,41個專業(yè)的專業(yè)點數(shù)僅1個,33個專業(yè)的專業(yè)點數(shù)僅2個。
從全國高職專業(yè)點設(shè)置數(shù)據(jù)爬蟲的設(shè)計與實現(xiàn)來看,使用Scrapy框架研發(fā)的爬蟲系統(tǒng)代碼簡潔,不需要再行開發(fā)下載網(wǎng)頁、下載調(diào)度等方面的功能,可以讓研發(fā)人員有更多的精力專注于業(yè)務(wù)相關(guān)的代碼的研發(fā)。該爬蟲在功能架構(gòu)上有6個功能模塊的需求,在技術(shù)架構(gòu)上實現(xiàn)了7個技術(shù)模塊,在數(shù)據(jù)庫中用6個表來存儲數(shù)據(jù),設(shè)計與實現(xiàn)了項目管道、數(shù)據(jù)項、網(wǎng)站爬蟲、異常處理中間件、偽裝中間件等技術(shù)模塊。該爬蟲總共爬取了275,873條專業(yè)點設(shè)置數(shù)據(jù)和770條專業(yè)名錄數(shù)據(jù),用來作全國專業(yè)點布局的大數(shù)據(jù)分析。