柳 菁 范 恩 童 杰
(紹興文理學(xué)院 機(jī)械與電氣工程學(xué)院,浙江 紹興 312000)
編程能力是計(jì)算機(jī)專業(yè)學(xué)生應(yīng)具備的基本專業(yè)能力.編程能力的培養(yǎng)需要學(xué)生具備扎實(shí)的數(shù)學(xué)基礎(chǔ)、清晰的邏輯思維能力、靈活的數(shù)據(jù)建模能力,并熟練掌握程序開發(fā)環(huán)境及語言、測試工具、軟件工程規(guī)范等計(jì)算機(jī)相關(guān)專業(yè)的知識. 它直接影響學(xué)生畢業(yè)后工作情況及薪資水
平[1-2].對計(jì)算機(jī)程序設(shè)計(jì)語言的學(xué)習(xí)有助于提升學(xué)生的邏輯思維能力以及解決實(shí)際問題的能力.
在線判題系統(tǒng)(Online Judge, 簡稱OJ)是高校編程能力訓(xùn)練的一種常用工具,已經(jīng)廣泛應(yīng)用于各種程序設(shè)計(jì)類課程,很多高校已先后建成在線做題系統(tǒng)[3-7].在浙江省內(nèi),以浙江大學(xué)、浙江工業(yè)大學(xué)、杭州電子科技大學(xué)等高校為代表,也都先后建有OJ系統(tǒng).其中,“拼題A(PTA)”是以浙江大學(xué)近20年在程序設(shè)計(jì)能力培養(yǎng)、精品與資源共享課程建設(shè)、在線開放課程建設(shè)、教學(xué)團(tuán)隊(duì)建設(shè)等方面的工作為基礎(chǔ),針對程序設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)等程序設(shè)計(jì)類課程的實(shí)踐性特征,重點(diǎn)結(jié)合新興的在線課程建設(shè)需求以及不同層次學(xué)校在程序設(shè)計(jì)類課程方面的實(shí)踐教學(xué)的需求而設(shè)計(jì)的.同時(shí),它致力于打造面向?qū)W校與企業(yè)的優(yōu)質(zhì)教學(xué)資源的共建、共享平臺(tái),開創(chuàng)了互聯(lián)網(wǎng)時(shí)代多校-多企共同參與、共同建設(shè)、共同利用教育資源的新模式.
高級語言教學(xué)過程中,以O(shè)J平臺(tái)進(jìn)行教學(xué),運(yùn)用探究式教學(xué)模式,既能注重過程考核,又能突出學(xué)生的主體作用,特別是提高學(xué)生的實(shí)踐動(dòng)手能力,同時(shí)也能夠較好地提高教學(xué)效果[4].在數(shù)據(jù)結(jié)構(gòu)的實(shí)踐教學(xué)過程中,以O(shè)J平臺(tái)中存在的問題為核心載體,通過課堂內(nèi)、外的自主探究與合作探究,既能夠凸顯學(xué)生學(xué)習(xí)的主體性、實(shí)踐性,又能提高學(xué)生的實(shí)踐能力,從而可以保障教學(xué)質(zhì)量[5].因此,通過OJ在線做題平臺(tái),對于計(jì)算機(jī)專業(yè)涉及的編程相關(guān)課程及實(shí)踐環(huán)節(jié),均具有明顯的學(xué)習(xí)效果.為此,通過學(xué)生在OJ平臺(tái)上的做題成績及相關(guān)數(shù)據(jù),有助于教師更好地了解學(xué)生的學(xué)習(xí)情況以及課程知識掌握情況.考慮到學(xué)生的編程基礎(chǔ)不同、自覺性不同,特別是考慮到學(xué)生線下在OJ上做題,需要通過學(xué)生在OJ上做題的情況,分析題目的難易程度以及學(xué)生的掌握程度.
李文華根據(jù)網(wǎng)絡(luò)爬蟲系統(tǒng)的基本原理,從爬蟲的設(shè)計(jì)原則與模塊結(jié)構(gòu)入手,開發(fā)出一種基于Python的網(wǎng)絡(luò)爬蟲系統(tǒng)[8].為從51job網(wǎng)站獲取有效的崗位招聘信息,甯文龍等采用Python的爬蟲技術(shù)對爬取的崗位信息進(jìn)行預(yù)處理,幫助用戶節(jié)省搜索和查詢匹配崗位的時(shí)間[9].通過對51job網(wǎng)站所有數(shù)據(jù)進(jìn)行爬取、統(tǒng)計(jì)和整理,劉一等進(jìn)一步提出一種基于Python的就業(yè)趨勢可視化系統(tǒng)[10],張俊威等對基于Python爬蟲的網(wǎng)頁抓取技術(shù)進(jìn)行概述,并對其相關(guān)應(yīng)用進(jìn)行分析[11].通過分析PCBA工業(yè)化過程中存在的問題,呂世超提出一種基于Python語言的自動(dòng)化測試系統(tǒng),能夠較好地提高生產(chǎn)測試效率[12].為了更好地對國內(nèi)電影網(wǎng)站數(shù)據(jù)進(jìn)行分析,高巍等利用Python網(wǎng)絡(luò)爬蟲技術(shù)從豆瓣網(wǎng)爬取電影的相關(guān)數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行可視化分析[13].針對微博輿情監(jiān)控的實(shí)際需求,劉子謙等開發(fā)出基于爬蟲的文本微博輿情分析系統(tǒng)[14].為了分析災(zāi)害輿情和估計(jì)災(zāi)害損失,李紹攀等利用網(wǎng)絡(luò)爬蟲爬取微博數(shù)據(jù),將Bayes情感分析模型用于自然災(zāi)害輿情分析[15].
綜上所述,考慮到爬蟲在獲取網(wǎng)頁數(shù)據(jù)上的優(yōu)勢,本文通過Python中的Xpath、Pandas、Beautiful Soup等工具,開發(fā)一個(gè)自動(dòng)化測試登錄的爬蟲程序,爬取PTA中學(xué)生的學(xué)習(xí)數(shù)據(jù),然后對其數(shù)據(jù)進(jìn)行可視化分析,最后從不同角度切入,分析題目的實(shí)際難易程度以及學(xué)生對知識點(diǎn)掌握的程度.
為降低數(shù)據(jù)獲取的成本,利用Python的第三方庫,比如Pandas、Beautiful Soup等,對PTA網(wǎng)址進(jìn)行自動(dòng)化登錄并對網(wǎng)頁做題數(shù)據(jù)進(jìn)行爬取和可視化處理.該系統(tǒng)主要包括以下功能:(1)利用Selenium工具模擬真實(shí)用戶上網(wǎng)行為,并進(jìn)行網(wǎng)站自動(dòng)化登錄,同時(shí)實(shí)現(xiàn)對圖片驗(yàn)證碼進(jìn)行自動(dòng)化測試;(2)利用Pandas、Beautiful Soup等工具對網(wǎng)頁內(nèi)指定內(nèi)容數(shù)據(jù)進(jìn)行爬??;(3)將爬取下的數(shù)據(jù)存入CVS格式的Excel文件;(4)通過對讀取爬取數(shù)據(jù),對數(shù)據(jù)進(jìn)行相應(yīng)的可視化處理.
系統(tǒng)的主要工作流程(見圖1)如下:①完成用戶名和密碼自動(dòng)輸入.主要利用Selenium庫,編寫程序模擬用戶自動(dòng)登錄目標(biāo)網(wǎng)站,使網(wǎng)站不會(huì)識別為自動(dòng)化代碼程序,避免被瀏覽器攔截的風(fēng)險(xiǎn);②檢測并自動(dòng)驗(yàn)證.主要利用Image庫,將彈出的驗(yàn)證碼圖片進(jìn)行截圖,對空缺處進(jìn)行位移和縮放計(jì)算,然后模擬用戶點(diǎn)擊滑動(dòng)按鈕并與空缺處對齊;③爬取網(wǎng)頁內(nèi)所需數(shù)據(jù).利用Pandas庫等,獲取網(wǎng)頁內(nèi)表格數(shù)據(jù),并且保存為本地報(bào)文,同時(shí)存儲(chǔ)到CSV文件中;④數(shù)據(jù)可視化.利用matplotlib庫對爬取的數(shù)據(jù)進(jìn)行可視化.
圖1 系統(tǒng)工作流程圖
Selenium是一個(gè)用于Web應(yīng)用程序測試的工具.它可以直接運(yùn)行在瀏覽器中,模擬用戶操作,支持IE、Mozilla Firefox、Safari、Google Chrome、Opera、Edge等瀏覽器(見圖2).
圖2 Selenium支持工具圖
Selenium的主要功能包括測試與瀏覽器的兼容性、測試系統(tǒng)功能、創(chuàng)建回歸測試以及檢驗(yàn)軟件功能和用戶需求.它支持自動(dòng)錄制動(dòng)作和自動(dòng)生成.Net、Java、Perl等不同語言的測試腳本.
框架底層使用JavaScript實(shí)現(xiàn)模擬用戶操作瀏覽器.執(zhí)行測試腳本時(shí),瀏覽器自動(dòng)按照腳本代碼完成點(diǎn)擊、輸入、打開、驗(yàn)證等操作,從終端用戶的角度測試應(yīng)用程序.此外,Selenium庫使用簡單,可以采用Java、Python等多種語言編寫用例腳本.
Pandas是NumPy的一種工具,主要用于解決數(shù)據(jù)分析任務(wù).Pandas納入大量的庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供高效操作大型數(shù)據(jù)集所需的工具,以及能夠快速便捷地處理數(shù)據(jù)的函數(shù)和方法.
常用的數(shù)據(jù)類型有以下6種.①Series:一維數(shù)組,能夠存儲(chǔ)不同種數(shù)據(jù)類型,字符串、boolean值、數(shù)字等都能保存在Series中.②Time-Series:以時(shí)間為索引的Series.③DataFrame:二維表格型數(shù)據(jù)結(jié)構(gòu),可以將DataFrame理解為Series的容器.④Panel:三維數(shù)組,可以理解為DataFrame的容器.⑤Panel4D:4維數(shù)據(jù)容器.⑥PanelND:擁有factory集合,可以創(chuàng)建像Panel4D一樣N維命名容器的模塊.⑦PanelND:擁有factory集合,可以創(chuàng)建像Panel4D一樣N維命名容器的模塊.
Beautiful Soup能夠提供一些簡單的、Python式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能.Beautiful Soup能夠自動(dòng)將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為utf-8編碼.
Beautiful Soup能夠?qū)?fù)雜HTML文檔轉(zhuǎn)換成復(fù)雜的樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對象,全部對象可以歸納為4種.①Tag:可以利用soup加標(biāo)簽名獲取對象標(biāo)簽的內(nèi)容,對象的類型是bs4.element.Tag;Tag有兩個(gè)重要的屬性,即name和attrs.②NavigableString:利用.string可以獲取標(biāo)簽的內(nèi)容.③Beautiful Soup:Beautiful Soup對象表示文檔的內(nèi)容;它可以作為Tag對象,表示一個(gè)特殊的Tag.④Comment:表示一個(gè)特殊類型的NavigableString對象.
為便于準(zhǔn)確掌握PTA平臺(tái)上學(xué)生的做題情況以及分析題目集的難易情況,首先采用Python自動(dòng)爬取PTA上的學(xué)生成績數(shù)據(jù)以及題目信息,然后對爬取的數(shù)據(jù)進(jìn)行可視化分析.部分爬取的統(tǒng)計(jì)數(shù)據(jù)如圖3所示.從圖3可以看出每一條原始記錄,主要包括提交時(shí)間、提交狀態(tài)、分?jǐn)?shù)、耗時(shí)、題目編號等字段.
圖3 部分原數(shù)據(jù)
數(shù)據(jù)采集功能的主要代碼如下.這里主要通過Selenium模擬用戶自動(dòng)登錄PTA,爬取頁面中用戶的相關(guān)做題數(shù)據(jù),并將其存儲(chǔ)到本地文件,為進(jìn)一步分析題目難易程度做好準(zhǔn)備.
圖4是單個(gè)編程題的通過數(shù)和提交數(shù)比例.由圖4可以看出,該題的通過數(shù)只占提交數(shù)的22.2%,說明該題較難且大多數(shù)學(xué)生對所涉及的知識點(diǎn)掌握不扎實(shí).
圖4 通過數(shù)與提交數(shù)對比圖
圖5是一個(gè)題目集的通過情況.通過圖5可以清楚看到各個(gè)題目通過率的高低以及各個(gè)習(xí)題通過率的對比.在圖5中,拐點(diǎn)越高,說明該題的通過率越高、難度越低,學(xué)生對該題所涉及的知識點(diǎn)掌握比較扎實(shí);相反,拐點(diǎn)越低、通過率越低,說明該題難度較大,以及學(xué)生對該題涉及的知識點(diǎn)掌握不牢.結(jié)合圖4和圖5進(jìn)行分析,可以看出該題目集的難易程度以及學(xué)生對所涉及知識點(diǎn)的整體掌握情況.
圖5 習(xí)題通過率
圖6和圖7給出了部分題目以及整個(gè)題目集的通過數(shù)和提交數(shù)的對比.通過圖6和圖7對提交數(shù)和通過數(shù)比較分析可以得到如下規(guī)律:通過數(shù)隨著提交數(shù)的變化而變化,反映學(xué)生在遇到難題時(shí)會(huì)進(jìn)行多次提交,這也反饋出學(xué)生做題的實(shí)際情況.
圖6 部分題目提交數(shù)和通過數(shù)對比
圖7 整個(gè)題目集的提交數(shù)和通過數(shù)對比
圖8給出了各題的分值及其實(shí)際平均分.根據(jù)平均分的折線趨勢,可以看出編程題的難度一般比函數(shù)題的難度大;通過對函數(shù)題和編程題的平均分對比,可以看出整個(gè)題目集的綜合難易程度較大.
圖8 平均分值對比
由圖9和圖10可知,通過對學(xué)生的做題平均得分,可以計(jì)算出該題目對學(xué)生的實(shí)際難易程度并進(jìn)行分類.根據(jù)實(shí)際得分,可以將題目分為四個(gè)類別:0.5以上通過率對應(yīng)題目的難度為容易,0.4~0.5通過率對應(yīng)題目的難度為一般,0.3~0.4通過率對應(yīng)題目的難度為困難,0.3以下通過率對應(yīng)題目的難度為較難.
圖9 每題平均得分
圖10 學(xué)生掌握情況圖
圖11統(tǒng)計(jì)了題目難易度及其題目個(gè)數(shù).在PTA平臺(tái)中,每道題目的難易程度被網(wǎng)站判題系統(tǒng)分為難度1和2,這與實(shí)際情況可能有些出入.對于不同高校的學(xué)生,可能出現(xiàn)將難度低的題目定為難度高的情況.通過圖11進(jìn)行數(shù)據(jù)分析,可以得出大部分題目的預(yù)期和實(shí)際難度比較一致.因此,題目難度符合預(yù)期.
圖11 題目難易度及其題目個(gè)數(shù)
為了提高計(jì)算機(jī)編程的實(shí)際教學(xué)效果,更好地利用好第三方做題平臺(tái),及時(shí)掌握學(xué)生的在線做題情況,本文利用基于Python的自動(dòng)化測試工具從在線做題系統(tǒng)爬取學(xué)生的做題數(shù)據(jù).基于Selenium+Python的自動(dòng)化測試應(yīng)用可以減少人工重復(fù)驗(yàn)證次數(shù),提高數(shù)據(jù)的爬取效率.通過數(shù)據(jù)可視化分析,可以更深入地了解學(xué)生的做題情況以及題目的難易程度.后期將進(jìn)一步優(yōu)化提高控件可視化識別的效率,加快元素定位的效率.