中國(guó)裁判文書(shū)網(wǎng)爬蟲(chóng)

實(shí)習(xí)的第一個(gè)爬蟲(chóng)項(xiàng)目就是爬取中國(guó)裁判文書(shū)網(wǎng),在爬這個(gè)網(wǎng)站的時(shí)候碰到一系列的問(wèn)題,剛好可以將這些問(wèn)題統(tǒng)一總結(jié)到我搭建的github博客上。

一、數(shù)據(jù)需求
1.案件相關(guān)信息 2.文書(shū)內(nèi)容(為了方便我直接存的html文件)


需求.png

二、網(wǎng)站分析
? “中國(guó)裁判文書(shū)網(wǎng)”是一個(gè)政府網(wǎng)站,所以他符合政府網(wǎng)站的一些缺點(diǎn),比如網(wǎng)頁(yè)響應(yīng)慢,不過(guò)有一點(diǎn)沒(méi)有想到的是這個(gè)網(wǎng)站的反爬措施做的還不錯(cuò),還需要花一番功夫去研究,接下來(lái)就開(kāi)始分析一下這個(gè)網(wǎng)站。

? 1.簡(jiǎn)單的了解這個(gè)網(wǎng)站,我們要爬取這個(gè)網(wǎng)站數(shù)據(jù)有兩個(gè)思路,一是使用瀏覽器自動(dòng)化工具selenium,模擬瀏覽爬取,二是找到url直接發(fā)起請(qǐng)求獲取數(shù)據(jù)。分析網(wǎng)站數(shù)據(jù)個(gè)人覺(jué)得第一種方法可以舍棄,抓取效率低,所以就直接使用第二種方法,尋找url。

? 2.在確定了抓取方法之后,就要開(kāi)始分析url了,可以使用瀏覽器的開(kāi)發(fā)者工具也可以使用專(zhuān)門(mén)的抓包工具,看個(gè)人習(xí)慣。很快就可以找到要的url,然后就是分析這個(gè)url,然后知道了這個(gè)url是post請(qǐng)求,然后又好多需要的參數(shù),接下來(lái)就是分析參數(shù)了,難點(diǎn)即使分析這些參數(shù)了。


抓包.png

? 3.分析參數(shù)


getcode.png
getlist.png

其中的難點(diǎn)參數(shù)有這幾個(gè):“vl5x”,“number”, “guid”

而其中number是另一個(gè)url返回的結(jié)果, 就是上面的那個(gè)GetCode的那個(gè)url,并且也是post請(qǐng)求,參數(shù)叫簡(jiǎn)單就是guid,接下來(lái)是要去找這個(gè)guid了。

? 4.尋找這個(gè)guid會(huì)發(fā)現(xiàn)他是由js代碼生成出來(lái)的,到這里一些新手可能就不會(huì)了,先分享一個(gè)執(zhí)行js代碼的包,execjs這里你可以瀏覽官方文檔https://pypi.org/project/PyExecJS/

pip install PyExecJS

這里我就直接從網(wǎng)頁(yè)里將這段代碼扒下來(lái)了

var createGuid = function () {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    };
guid1 = createGuid() + createGuid() + "-" + createGuid() + "-" + createGuid() + createGuid() + "-" + createGuid() + createGuid() + createGuid();
var guid = function (){
    return (createGuid() + createGuid() + "-" + createGuid() + "-" + createGuid() + createGuid() + "-" + createGuid() + createGuid() + createGuid());
}

執(zhí)行這段技術(shù)代碼就可以獲取到需要的guid。

? 4.到上一步,就獲取到guid,number,就剩一個(gè)vl5x了,這是整個(gè)爬蟲(chóng)的關(guān)鍵,也是難點(diǎn), 這個(gè)參數(shù)搞定了就相當(dāng)于解決整個(gè)完整的1/3了。我們查看源網(wǎng)頁(yè),可以發(fā)現(xiàn)這個(gè)參數(shù)是js生成的然后可以進(jìn)行,不過(guò)這段js進(jìn)行了js混淆,所以看到的都是看不懂的js代碼,到這里一下就懵了,去網(wǎng)上搜js反混淆,然后解密出來(lái)你會(huì)發(fā)現(xiàn)有個(gè)cookie的東西,把它去掉替換成,具體的Js代碼在我的github里面,有興趣可以看看。

? 5.到這里相關(guān)的參數(shù)搞定了,然后就可以獲取到數(shù)據(jù)了。接下來(lái)就是依據(jù)這些數(shù)據(jù)來(lái)解決文書(shū)的獲取了,文書(shū)的獲取可以說(shuō)是這個(gè)網(wǎng)站最難的一步,涉及到j(luò)s加密解密的相關(guān)問(wèn)題,這里對(duì)js熟悉就好分析,不過(guò)不怎么熟悉的也可以搞定,只要認(rèn)真研究一下js,就可以理解。

? 6.獲取文書(shū)需要用到之前獲取的json串里的'RunEval'和'文書(shū)ID',這兩個(gè)參數(shù)是用來(lái)獲取文書(shū)的url的,獲取到了url,get請(qǐng)求就可以拿到數(shù)據(jù)。文書(shū)內(nèi)容是在HTML標(biāo)簽里,可以用正則匹配出來(lái),然后寫(xiě)入到HTML中保存為HTML文件。


文書(shū)url.png
文書(shū)內(nèi)容.png

? 對(duì)于如何解密文書(shū)url,有點(diǎn)復(fù)雜,可以花點(diǎn)時(shí)間自己研究,也可以直接訪問(wèn)我的github去看源碼

三、代碼框架

? 1.沒(méi)有使用爬蟲(chóng)框架,就是單純的使用requests庫(kù)來(lái)寫(xiě)的整個(gè)爬蟲(chóng),還有就是結(jié)合redis來(lái)將爬去的數(shù)據(jù)緩存,然后再持久化到MySQL。

四、代碼實(shí)現(xiàn)

? 代碼直接訪問(wèn)github,可以關(guān)注一下,以后會(huì)分析更新,還有其他技術(shù)

五、主要技術(shù)

? 1.原生requests包

? 2.使用IP代理池,代理IP放于redis中,太陽(yáng)代理(快代理,訊代理等)

? 3.使用redis緩存數(shù)據(jù)

? 4.使用MySQL進(jìn)行數(shù)據(jù)持久化處理

? 5.使用進(jìn)程池進(jìn)行爬蟲(chóng)

六、總結(jié)

? (1)關(guān)于網(wǎng)站:

? 1.整個(gè)網(wǎng)站需要是不是得關(guān)注一下,可能會(huì)更新反爬,需要找到相應(yīng)的方法解決問(wèn)題。

? 2.網(wǎng)站相應(yīng)慢,可以不要訪問(wèn)的這么快,給人留條活路,不然網(wǎng)站崩了,就麻煩了。

? (2)關(guān)于代碼:

? 1.先將爬取的數(shù)據(jù)放入redis中,在從redis將數(shù)據(jù)持久化,優(yōu)化mysql鏈接過(guò)時(shí)或者超過(guò)最大鏈接數(shù)的問(wèn)題

? 2.使用多線程,以及部署多臺(tái)服務(wù)器,解決js解密速度慢,以及網(wǎng)站服務(wù)器反應(yīng)慢的問(wèn)題,同時(shí)在一定程度上控制進(jìn)程數(shù),防止網(wǎng)站癱瘓

后續(xù)內(nèi)容:
增量更新:
根據(jù)時(shí)間倆做到增量更新,同時(shí)也可以根據(jù)時(shí)間作為參數(shù)來(lái)抓取數(shù)據(jù),不過(guò)好像做多只能拿到2000條數(shù)據(jù),暫時(shí)還沒(méi)有其他的增量更新的方法。

關(guān)于封IP比較快的問(wèn)題:
1.網(wǎng)站在訪問(wèn)比較頻繁的情況下會(huì)出現(xiàn)驗(yàn)證碼,這就給人一種IP被封的感覺(jué),所以,只要時(shí)不時(shí)的輸入一下驗(yàn)證碼就OK了,當(dāng)然,有錢(qián)的話一直換IP就好了

關(guān)于給假數(shù)據(jù)的問(wèn)題:
對(duì)于假數(shù)據(jù),我還沒(méi)有去研究,不過(guò)發(fā)現(xiàn)訪問(wèn)不怎么正常就會(huì)有假數(shù)據(jù),然后還沒(méi)有發(fā)現(xiàn)網(wǎng)站是靠什么給假數(shù)據(jù),我暫時(shí)的做法就是過(guò)濾掉假數(shù)據(jù),等有時(shí)間在去研究一下,怎么規(guī)避這個(gè)問(wèn)題
歡迎關(guān)注我的github
去我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容