楊 寅
(山西職業(yè)技術(shù)學(xué)院 計算機(jī)工程系,山西 太原 030006)
Python是基于GPL協(xié)議的面向?qū)ο笮烷_發(fā)語言,具備強(qiáng)大的擴(kuò)展性能,不僅可以調(diào)用由其它語言開發(fā)的功能模塊,而且Python自身的編譯器也可以被集成在其它編程語言中進(jìn)行調(diào)用,非常適用于大數(shù)據(jù)分析、人工智能等結(jié)構(gòu)復(fù)雜、需要綜合運(yùn)用多種編程語言的軟件項(xiàng)目的開發(fā)中。
網(wǎng)絡(luò)爬蟲技術(shù)(Web Crawler)起源于搜索引擎對Web頁面描述信息的自動抓取功能,網(wǎng)絡(luò)爬蟲技術(shù)的本質(zhì)是根據(jù)預(yù)設(shè)的信息檢索與過濾規(guī)則自動抓取網(wǎng)絡(luò)上的Web頁面數(shù)據(jù)的程序[1],其主要任務(wù)是從互聯(lián)網(wǎng)上的海量數(shù)據(jù)中有針對性地獲取特定目標(biāo)主題的內(nèi)容,并且以自動運(yùn)行的方式完成數(shù)據(jù)的檢索、甄別與下載、存儲,為用戶提供高質(zhì)量、高效率的數(shù)據(jù)資源積累服務(wù)。網(wǎng)絡(luò)爬蟲技術(shù)的運(yùn)行原理如圖1所示。
網(wǎng)絡(luò)爬蟲技術(shù)的具體運(yùn)行過程如下:
步驟1:在爬蟲程序中對信息檢索與過濾規(guī)則進(jìn)行初始化設(shè)置;
步驟2:向Web服務(wù)器發(fā)送Url請求以獲取其Web頁面;
步驟3:讀取Web頁面的Html完整源代碼;
步驟4:根據(jù)預(yù)設(shè)的過濾規(guī)則對Html源碼內(nèi)容進(jìn)行甄別與篩選;
步驟5:將獲取到的有效數(shù)據(jù)存儲至本地并建立檢索關(guān)鍵字與索引。
當(dāng)前大學(xué)生群體中消極應(yīng)對學(xué)習(xí)任務(wù)的現(xiàn)象在全國各地的高校中都普遍存在。據(jù)調(diào)查,現(xiàn)階段普通高校大學(xué)生中從未有過作業(yè)抄襲行為的占33.7%,偶爾抄襲的占49.2%,經(jīng)常抄襲的占17.1%[2]。日益嚴(yán)重的抄襲作業(yè)的現(xiàn)象不僅對高校人才培養(yǎng)質(zhì)量形成了干擾,還嚴(yán)重地影響到學(xué)校的學(xué)風(fēng)建設(shè)與誠信教育。
網(wǎng)絡(luò)抄襲的現(xiàn)象在諸如課程論文、社會實(shí)踐報告、劇本創(chuàng)作等總結(jié)、論述類型的作業(yè)中表現(xiàn)的尤為嚴(yán)重。而作業(yè)抄襲內(nèi)容的來源主要基于百度、360等搜索引擎的檢索結(jié)果,同時為了規(guī)避教師使用搜索引擎進(jìn)行檢查,往往選用排名靠后(第10頁以后)的檢索結(jié)果進(jìn)行復(fù)制、抄襲,更增大了教師對作業(yè)抄襲行為的甄別難度與工作量。
現(xiàn)階段,針對網(wǎng)絡(luò)抄襲問題,主要有三種解決方案:第一種是通過CNKI(即國家知識基礎(chǔ)設(shè)施)創(chuàng)建的學(xué)術(shù)不端論文檢測平臺進(jìn)行查重。該方案檢索范圍廣、分析結(jié)果全面準(zhǔn)確,但其缺點(diǎn)是成本高(需要專門購買檢索服務(wù))、耗時長(完成一次檢測需要1~2小時),目前僅被使用于高校畢業(yè)論文的查重檢測工作中;第二種是使用以Paperpass為代表的中文文獻(xiàn)相似度對比系統(tǒng)進(jìn)行檢索。該方案的檢索效率要遜于CNKI的論文檢測平臺,但是在成本和響應(yīng)時間方面具備明顯優(yōu)勢,當(dāng)前在期刊論文檢測中被廣泛使用,但作為付費(fèi)型系統(tǒng),仍無法在高校的日常教學(xué)過程中被廣泛應(yīng)用;第三種方案是使用人工方式通過搜索引擎對學(xué)生提交的作業(yè)內(nèi)容進(jìn)行逐一檢索。這種方案耗時長、效率低且精確度差,但由于受到成本限制,大部分任課教師不得不將其作為當(dāng)前課程作業(yè)抄襲檢測的主要方式[3]。
針對當(dāng)前大學(xué)生課程作業(yè)的網(wǎng)絡(luò)抄襲現(xiàn)象的特點(diǎn)、數(shù)據(jù)來源以及教師在抄襲檢測方面遇到的困境。本文嘗試構(gòu)建了基于網(wǎng)絡(luò)爬蟲技術(shù)的作業(yè)抄襲分析系統(tǒng),充分發(fā)揮爬蟲技術(shù)在基于搜索引擎的數(shù)據(jù)抓取方面的巨大優(yōu)勢,在零使用成本的前提下提供較高精準(zhǔn)度與高效率的網(wǎng)絡(luò)抄襲分析服務(wù),以有效地解決當(dāng)前課程作業(yè)抄襲檢測工作中遇到的問題。
網(wǎng)絡(luò)抄襲檢測的工作過程基于對搜索引擎檢索結(jié)果(即作業(yè)抄襲的主要信息來源)的讀取與分析來展開,具體內(nèi)容包括待檢測數(shù)據(jù)的采集、關(guān)鍵詞的獲取、調(diào)用搜索引擎檢索網(wǎng)絡(luò)數(shù)據(jù)、比對并分析結(jié)果等幾個步驟,其詳細(xì)流程如圖2所示。
圖2 網(wǎng)絡(luò)抄襲檢測系統(tǒng)的工作流程Fig.2 Work flow of the network plagiarism detection system
本文所構(gòu)建的網(wǎng)絡(luò)抄襲檢測系統(tǒng)模型,主要由作業(yè)文檔提交、作業(yè)文檔內(nèi)容分析、網(wǎng)絡(luò)爬蟲檢索、分析結(jié)果管理與系統(tǒng)數(shù)據(jù)庫5個模塊構(gòu)成,其框架如圖3所示。
圖3 網(wǎng)絡(luò)抄襲檢測系統(tǒng)的整體框架Fig.3 The overall framework of the network plagiarism detection system
由圖3可知,構(gòu)建于底層數(shù)據(jù)庫之上的網(wǎng)絡(luò)抄襲檢測系統(tǒng),主要由4個模塊負(fù)責(zé)完成其工作,其中的作業(yè)提交模塊負(fù)責(zé)作業(yè)基本信息(作者的姓名、學(xué)號、課程作業(yè)名稱等)在系統(tǒng)數(shù)據(jù)庫中的記錄以及作業(yè)文檔的上傳,而考慮到當(dāng)前微軟Office軟件的廣泛普及與Python語言對Word文檔的強(qiáng)大處理能力,向系統(tǒng)中提交的作業(yè)文檔均應(yīng)以Word文檔的格式進(jìn)行上傳,在上傳完成后由Python編寫的作業(yè)文檔分析模塊對文檔內(nèi)容進(jìn)行識別,提取其中的關(guān)鍵詞,并將信息存儲至系統(tǒng)數(shù)據(jù)庫中;網(wǎng)絡(luò)爬蟲模塊是系統(tǒng)的核心部分,負(fù)責(zé)將存儲于數(shù)據(jù)庫中的待檢測作業(yè)信息逐一讀取后構(gòu)建爬蟲程序的信息檢索與過濾規(guī)則,并以此為基礎(chǔ)啟動爬蟲程序,基于搜索引擎的檢索結(jié)果對網(wǎng)絡(luò)中的相近內(nèi)容進(jìn)行比對與分析,最后生成檢索分析結(jié)果,并存入系統(tǒng)數(shù)據(jù)庫中;系統(tǒng)最終根據(jù)這些分析結(jié)果信息自動創(chuàng)建作業(yè)抄襲分析報告,并通過分析結(jié)果管理模塊直觀地呈現(xiàn)給用戶。
3.3.1上傳文檔過程的實(shí)現(xiàn)
待檢測的作業(yè)以Word文檔(即Docx后綴名)格式進(jìn)行上傳,使用PHP語言實(shí)現(xiàn)。關(guān)鍵代碼及說明如下:
if ($-FILES["docx-file"]["error"]> 0)//上傳文件并檢測是否出現(xiàn)錯誤
echo "upload error..";
else
if($-FILES["docx-file"]["type"]=="docx")//判斷文件類型是否為Docx
{$docx-url=$-FILES["file"]["tmp-name"];//獲取PHP的臨時文件存儲位置
move-uploaded-file($docx-url, "upload/".time());}//保存文件并以當(dāng)前時間命名
else
echo "file type error..";
3.3.2文檔分析過程的實(shí)現(xiàn)
對Word文檔內(nèi)容的解析使用Python語言的Python-docx模塊來實(shí)現(xiàn)。關(guān)鍵代碼及說明如下:
import docx//引入Python-docx模塊
import MySQLdb//引入數(shù)據(jù)庫訪問模塊
doc-obj=docx.Document('filepath')//讀取指定的Word文件內(nèi)容
n=len(doc-obj.paragraphs)//獲取文件中的段落總數(shù)
for i in range(len(n))://逐一處理文檔中所有段落內(nèi)容
para=doc-obj.Paragraphs[i]
strat-txt=print para.Range.text[0:10]//獲取每個段落中前10個字符
end-txt=print para.Range.text[-10:]//獲取每個段落中后10個字符
data-insert(i,strat-txt, end-txt)//將段落序號與字符內(nèi)容插入數(shù)據(jù)庫中
def data-insert (i,starts,ends)://數(shù)據(jù)庫訪問函數(shù)
data-obj=MySQLdb.connect("訪問地址", "賬號", "密碼", "庫名稱", charset='utf8')
//創(chuàng)建與數(shù)據(jù)庫的連接
cs-obj=data-obj.cursor()//創(chuàng)建數(shù)據(jù)庫操作游標(biāo)
sql-txt='Insert Into tabelname Values('+i+','+starts+','+ends+')'//構(gòu)建Sql命令
cs-obj.execute(sql-txt)//執(zhí)行Sql命令
cs-obj.close()//關(guān)閉數(shù)據(jù)庫連接
3.3.3多線程網(wǎng)絡(luò)爬蟲的實(shí)現(xiàn)
import re
import time
import requests
from concurrent.futures import ThreadPoolExecutor
thd-obj=ThreadPoolExecutor(10)//構(gòu)建線程量為10的線程池;
def crawler(txt)://爬蟲主程序
brow-obj=webdriver.Chrome()
brow-obj.get('http://www.baidu.com')//訪問百度主頁
control-obj=brow-obj.find-element-by-id("kw")//定位輸入框
control-obj.send-keys("txt")//輸入檢索字符
bott-obj=brow-obj.find-element-by-id("su")//定位搜索按鈕
bott-obj.click()//開始檢索數(shù)據(jù)
time.sleep(3)//等待檢索結(jié)果
manipulation();//調(diào)用處理數(shù)據(jù)函數(shù)
while next-web://使用循環(huán)逐頁處理檢索結(jié)果
try:
hlink-obj=brow-obj.find-element-by-link-text("下一頁>")//定位’下一頁’超鏈接
hlink-obj.click()//打開下一頁
time.sleep(2)//等待打開頁面
manipulation();//調(diào)用搜索結(jié)果頁面處理函數(shù)
except:
break//已完成最后一頁的處理,結(jié)束循環(huán)
def manipulation(txt)://搜索結(jié)果頁面處理函數(shù)
response=urllib.request.urlopen()
code=response.read()//獲取當(dāng)前頁面的Html源碼
urllist=[]
urllist=getpageurl(code)//獲取當(dāng)前頁面中的Url地址集合
analysed(urlist,txt)//調(diào)用Url地址內(nèi)容處理函數(shù)
def analysed(urlist,txt):
code-obj=GetHtml.GetHtml
for u in urllist:
codes=code-obj.getHtml(u)//獲取源代碼
if(string.find(codes,txt))//檢測源碼中是否包含論文中的關(guān)鍵字
data-insert2 (u,txt)//將Url和關(guān)鍵詞插入數(shù)據(jù)庫中
def data-insert2 (u,txt):
dataurl-obj=data-obj.cursor()
sql-cmd='Insert Into tabelname Values('+u+','+txt+')'
dataurl-obj.execute(sql-cmd)//執(zhí)行SQL命令
dataurl-obj.close()//關(guān)閉數(shù)據(jù)庫連接
for n in range(10):
sel-txt=cursor.fetchone()//讀取當(dāng)前數(shù)據(jù)并將游標(biāo)指針移至下一條數(shù)據(jù)
thd-obj.submit(crawler,sel-txt,n).add-done-callback(crawler)//將任務(wù)提交到線程池
大學(xué)生作業(yè)抄襲現(xiàn)象的泛濫,不僅不利于其個人素質(zhì)及能力的培養(yǎng),更對學(xué)校的學(xué)風(fēng)、人文環(huán)境建設(shè)造成負(fù)面影響。矯正作業(yè)抄襲的問題,需要涉及到學(xué)風(fēng)、評價體系構(gòu)建、誠信教育等諸多方面。本文從技術(shù)角度出發(fā),針對作業(yè)抄襲的主要信息來源(搜索引擎)構(gòu)建了基于網(wǎng)絡(luò)爬蟲技術(shù)的作業(yè)抄襲檢測系統(tǒng)模型,該系統(tǒng)具有良好的可行性、實(shí)用性以及部署運(yùn)行簡便、零使用成本的優(yōu)勢,希望在預(yù)防和克服學(xué)生作業(yè)抄襲的方面能夠?yàn)閺V大教師提供有益的幫助。