董紅松,孔躍輝,葛 軍,劉繼華
(1.呂梁學(xué)院計算機(jī)科學(xué)與技術(shù)系,山西 呂梁 033000;2.呂梁學(xué)院信息中心,山西 呂梁 033000)
將基于爬蟲技術(shù)的數(shù)據(jù)挖掘和分析運(yùn)用到各行業(yè)[1]已經(jīng)日益成熟。目前,國內(nèi)對司法領(lǐng)域案件數(shù)據(jù)挖掘分析也取得顯著的成果,如王超[2]等人做過基于“中國裁判文書網(wǎng)”的數(shù)據(jù)分析。但是國內(nèi)在刑法案情的爬蟲方面依然有不足之處。第一,當(dāng)前數(shù)據(jù)挖掘方面也主要集中在非常結(jié)構(gòu)化的裁判文書網(wǎng)上,其中陳忠海[3]等人做了“中國裁判文書網(wǎng)”的調(diào)查與分析有關(guān)的研究,而對于其他司法網(wǎng)站結(jié)構(gòu)化程度較弱的案情缺乏研究;第二,研究設(shè)計的有關(guān)案件的爬蟲算法只能針對某一類型的數(shù)據(jù)進(jìn)行挖掘和分析,如雷向晶[4]等人以裁判文書網(wǎng)數(shù)據(jù)為依據(jù),完成公證證據(jù)在虛擬財產(chǎn)案件中的使用困境及解決對策,缺乏普適性。
在結(jié)合前人網(wǎng)頁爬蟲設(shè)計思路,如張莉婧等人設(shè)計的圖書館爬蟲算法[5],朱慶生等人的基于鏈接和內(nèi)容分析的爬蟲算法的研究[6]基礎(chǔ)上,針對“XXX網(wǎng)”發(fā)布的刑事案情進(jìn)行了研究,并設(shè)計了一種爬蟲算法,通過算法做出分類等處理。主要針對三類案件:一是涉及黃賭毒治理的刑事案件;二是對新冠肺炎治理涉及的刑事案件;三是對一般的社會治理的刑事案情,如偷盜,黑社會,暴力等案件進(jìn)行歸類,但本算法不止可以爬取以上三類案件,對其他案件依然有效。然后通過該算法進(jìn)行了數(shù)據(jù)分析等操作。該算法具有普遍適應(yīng)性,在此基礎(chǔ)上做出數(shù)據(jù)分析,完成數(shù)據(jù)存儲。
通過“XXX網(wǎng)”網(wǎng)址,進(jìn)入頁面,審判的案情分成多類,包括民事案情、刑事案情、行政案情等。以刑事案情為例,所有刑事案情呈現(xiàn)縱向列表分布,每件案情在本頁面提供標(biāo)題和案情發(fā)生時間。選擇首頁面檢查源碼,通過觀察網(wǎng)頁源碼發(fā)現(xiàn),所有案情標(biāo)題,均在“元素”下的某列表下,選擇得到標(biāo)題所在位置的路徑。隨機(jī)點擊某一個標(biāo)題的具體案情,查看源碼,對比發(fā)現(xiàn),所有文本均在一個相同的列表下,不同的只是所在網(wǎng)頁的不同。
經(jīng)過網(wǎng)頁源碼分析以及對網(wǎng)頁布局進(jìn)行分析后,需要對文本內(nèi)容進(jìn)行挖掘和處理等操作,研究對象“XXX網(wǎng)”的頁面呈現(xiàn)靜態(tài)形式,結(jié)合實際需求,為減輕服務(wù)器的后臺壓力,提出一種針對“XXX網(wǎng)”的爬蟲方式,通過給關(guān)鍵函數(shù)提供URL,獲取刑法案例標(biāo)題頁面所有標(biāo)題和鏈接,聯(lián)系鏈接構(gòu)建新的URL,從而訪問不同URL獲取每一個案例的文本,加以處理并存取,利用正則表達(dá)式提取一頁所有數(shù)據(jù),反復(fù)循環(huán)執(zhí)行以上操作,保證爬取所有文本,最后利用代碼進(jìn)行數(shù)據(jù)分析操作。爬取流程如圖1所示。
圖1 算法原理框圖
由于獲取的每個網(wǎng)頁都只有一個案例文本,而所有網(wǎng)頁的鏈接都在標(biāo)題頁面。因此設(shè)計思路的第一步是獲取所有的鏈接,代碼流程圖如圖2所示。
圖2 獲取網(wǎng)頁鏈接示意圖
當(dāng)獲取到存放一頁所包含標(biāo)題個數(shù)i的鏈接數(shù)組后,需要處理鏈接形成新的URL,獲取網(wǎng)頁每個案情文本流程圖如圖3所示。Pycharm開發(fā)環(huán)境中,調(diào)用CSS選擇器,獲取文本。需要注意的是:需要對源文本進(jìn)行譯碼操作,網(wǎng)站后臺服務(wù)器傳回來的數(shù)據(jù)屬于二進(jìn)制,而文本可視需要的文件格式屬于UTF-8格式,可以通過設(shè)置格式response.apparent_encoding轉(zhuǎn)換成txt文件,便于后期通過正則表達(dá)式提取關(guān)鍵數(shù)據(jù)。在程序中,循環(huán)處理i次鏈接,每個鏈接對應(yīng)一個網(wǎng)址,總計每次會處理i個網(wǎng)址。這i個鏈接在前期處理好后會存入一個數(shù)組中,每獲取一次網(wǎng)頁文本時,只需讀取數(shù)組序號便可以得到數(shù)組鏈接。
圖3 獲取網(wǎng)頁文本流程圖
對涉及到的三個類別刑法案例分別進(jìn)行處理,有利于后期數(shù)據(jù)統(tǒng)計,算法主要的思路是匹配關(guān)鍵字,利用正則表達(dá)一一匹配。其三個類別的關(guān)鍵字存放到三個數(shù)組中間,三個類別的關(guān)鍵數(shù)組分別為:guan_jian_zi1=[' 黃',' 賭',' 毒',' 色'];guan_jian_zi2=[' 疫情',' 藥',' 防控',' 病毒',' 口罩',' 疫苗',' 野',' 狩獵',' 獵'];guan_jian_zi3=[' 假',' 拐',' 騙' ,' 暴力',' 惡',' 黑社會',' 打',' 殺',' 偽',' 偷',' 盜',' 竊']。本算法做出分類的流程如圖4所示。
圖4 刑法案例文本歸類流程圖
2.3中將文本進(jìn)行歸類,此處對每個文本的數(shù)據(jù)進(jìn)行挖掘。經(jīng)過前期歸納發(fā)現(xiàn),由于每個刑法案情審判的結(jié)果都有罰款金額或者有期徒刑。因此主要挖掘的數(shù)據(jù)為每個案情的罰款金額數(shù)目和有期徒刑的時間,并將兩類數(shù)據(jù)通過excel進(jìn)行表格存取。實現(xiàn)該設(shè)計時需要提前建立excel文件,在抓取數(shù)據(jù)只需要調(diào)用此文件的本地路徑即可,每次抓取到文本后,直接進(jìn)行處理文本數(shù)據(jù),省略了傳遞文本,存儲文本后再讀取文本的過程,大大的改善了算法的實現(xiàn)效率。
在實現(xiàn)算法時,大量運(yùn)用了正則表達(dá)式提取關(guān)鍵數(shù)據(jù),因此列舉出關(guān)于正則表達(dá)函數(shù)的設(shè)計。用正則程序提取標(biāo)題的關(guān)鍵詞:例如一個刑法案例的標(biāo)題為“多次容留他人吸毒,情侶一人獲刑一人獲拘役”,預(yù)先定義一個關(guān)鍵詞組guan_jian_zi1=['黃','賭','毒','色'],將標(biāo)題定義文本以字符串的類型傳遞給列表F2,利用F2[0].find(guan_jian_zi1[m],0,len(F2[0])-1)此類函數(shù)查找F2中是否含有關(guān)鍵詞組guan_jian_zi1的元素,若有則輸出這個關(guān)鍵字的位置,其中m表示元素位置,len(F2[0])-1表示字符串的長度。運(yùn)行代碼,本函數(shù)輸出的為8,觀察標(biāo)題:“毒”字正位于標(biāo)題第八個位置。在刑事案情的案件時間、罰款金額數(shù)據(jù)提取,刑事案情有期徒刑的提取,均運(yùn)用了正則表達(dá)式,對于每種設(shè)計方案具體運(yùn)用的關(guān)鍵代碼函數(shù)如圖5所示。
圖5 關(guān)鍵代碼函數(shù)示意圖
圖5中,在罰額和有期徒刑的程序中,運(yùn)用了re庫compile函數(shù),其函數(shù)意義是通過關(guān)鍵字查找關(guān)鍵字,“.*?”表示關(guān)鍵字全部內(nèi)容。
訪問程序作為爬蟲設(shè)計的開頭部分,包含模擬瀏覽器的部位,請求部位,譯碼部位等。因此對本算法設(shè)計的訪問代碼程序做出分析與說明。訪問服務(wù)器的程序代碼如下圖6所示。
圖6 訪問服務(wù)器代碼示意圖
在這段程序中,第一行代碼中的header為自定義設(shè)計的一個模擬瀏覽器,在該行代碼中,設(shè)置的瀏覽器版本為Mozilla/4.0,windows操作系統(tǒng)版本為Windows NT,第一行代碼中的瀏覽器設(shè)置可以進(jìn)行合理的修改。
第二行代碼為正式訪問服務(wù)器的請求函數(shù),本行代碼主要通過requests函數(shù)進(jìn)行請求,該函數(shù)帶的三個參數(shù)主要有url(訪問目標(biāo)網(wǎng)頁的網(wǎng)址)、headers(瀏覽器參數(shù)配置)、verify(訪問瀏覽器的驗證書),需要注意的是verify=False表示不需要進(jìn)行驗證書進(jìn)行驗證。
第三行代碼表示響應(yīng)服務(wù)器,并接收服務(wù)器傳回的文件。
第四行代碼print()函數(shù)表示打印,type()函數(shù)為文件格式,“XXX網(wǎng)”的服務(wù)器傳回給瀏覽器的所有文件屬于二進(jìn)制格式,代碼中的response.content是本地文件接收到的文件內(nèi)容。
最后一行代碼,直接對二進(jìn)制文件進(jìn)行了譯碼操作,該行代碼轉(zhuǎn)換成text的文件格式,并將翻譯的文本以單列表的類型傳遞給了變量html2,html2存放文本,也就便于后期進(jìn)行直接的數(shù)據(jù)挖掘和處理。
本算法經(jīng)過實際測試發(fā)現(xiàn),能夠避免服務(wù)器后臺的封殺IP,屬于單線程爬取文本類型。該算法在每次訪問服務(wù)器時均有時間間隔設(shè)置,以此減輕后臺服務(wù)器的運(yùn)行壓力,避免了后臺服務(wù)器的過度訪問造成的經(jīng)濟(jì)損失。從網(wǎng)頁的分析角度入手,對網(wǎng)頁規(guī)律進(jìn)行挖掘,對算法各功能模塊進(jìn)行設(shè)計,由于python語言屬于高層語言,因此本算法也便于后續(xù)研究開發(fā)。本算法處理的對象為“XXX網(wǎng)”每天公布的刑事案情,算法適應(yīng)性廣,只要網(wǎng)頁格式類似與“XXX網(wǎng)”或者網(wǎng)頁文本呈現(xiàn)規(guī)律線性分布,均可以利用所設(shè)計的算法進(jìn)行爬取。本算法與傳統(tǒng)算法的不同在于,該算法使用者可以設(shè)置爬蟲上限,且不會對網(wǎng)站造成經(jīng)濟(jì)損失,不會對服務(wù)器造成壓力。本算法僅用于測試,得到的數(shù)據(jù)僅用于科學(xué)研究,不做任何商業(yè)用途,且不涉及任何敏感信息。