web掃描爬蟲(chóng)優(yōu)化
0x01 需求背景
公司要弄自動(dòng)化的掃描工具,目前市面上的工具都無(wú)法針對(duì)業(yè)務(wù)進(jìn)行檢測(cè),所以只能自己開(kāi)發(fā)。辣么,就有個(gè)問(wèn)題,爬蟲(chóng)需要自己去寫(xiě)。
之前自己也寫(xiě)過(guò)相關(guān)的爬蟲(chóng),但是要么是半成品,要么就是垃圾代碼…很多都無(wú)法直接引用,所以,在強(qiáng)大的KPI考核下,強(qiáng)迫自己代碼重構(gòu)。用Python寫(xiě)起。
0x02 遇到問(wèn)題
本身在爬蟲(chóng)上輕車(chē)熟路,很輕易就寫(xiě)出了一個(gè)根據(jù)多線(xiàn)程的爬蟲(chóng),完成整站掃描,但是問(wèn)題來(lái)了,效率如何提高。仔細(xì)觀(guān)察下掃描的鏈接就發(fā)現(xiàn),它爬取了很多鏈接,都是一些重復(fù)性比較高的鏈接,例如以下:

這些鏈接都是靜態(tài)的頁(yè)面,也就是一些新聞之類(lèi)的,頁(yè)面架構(gòu)的都差不多,這個(gè)情況我們自己知道,但是爬蟲(chóng)是不了解的。它只是按照我們指定的規(guī)則去做,所以導(dǎo)致爬蟲(chóng)效率降低。
在我預(yù)想的情況下,一些靜態(tài)的頁(yè)面,我們是可以減少抓取的,通過(guò)減少抓取我們可以提高整體的效率。例如:
http://www.xxx.com/news/ziyue/2014/1029/61069.html
http://www.xxx.com/news/ziyue/2014/1029/61070.html
http://www.xxx.com/news/ziyue/2014/1029/61071.html
這三個(gè)URL中,我們只需要抓取一條作為典型,完全就能達(dá)到我們的需求,不需要將所有的抓下來(lái)。因?yàn)榇蠹叶贾溃@是偽靜態(tài)生成的。那么問(wèn)題來(lái)了,該怎樣去做這個(gè)規(guī)則?小伙伴可能有想法說(shuō):“你怎么知道這種靜態(tài)頁(yè)面就一定架構(gòu)一樣呢?” 好吧,我不確定,但是我有辦法去確定。現(xiàn)在就以上面的URL做個(gè)拆分了解下:
http://www.xxx.com/ 這個(gè)是host
/news/ziyue/2014/1029/ 這個(gè)是具體的目錄,或者說(shuō)是具體的文章歸類(lèi)。
61069.html 這個(gè)是具體的頁(yè)面。
上面分析后,小伙伴又有新的問(wèn)題:“莫裝逼,你怎么知道人家的URL一定按照這個(gè)標(biāo)準(zhǔn)來(lái)?” 好吧,對(duì)此我整理了下我所發(fā)現(xiàn)的URL組合規(guī)則,目前很多URL都是以以下幾種方式組成的。
1)靜態(tài)頁(yè)面型:
http://[host]/xxx/xxx/xxx/[int|string].html
2)rewrite型:
http://[host]/xxx/xxx/xxx/[string|int]
3)目錄型:
http://[host]/xxx/xxx/xxx/Catalog/
4)不固定型:
http://[host]/xxx/xxx/xxx/file.[asp|php|aspx|do|jsp]?[string|int]=[string|int]
0x03 奇葩的實(shí)驗(yàn)
找到了這些規(guī)律后,應(yīng)該考慮怎樣去把爬蟲(chóng)的質(zhì)量提升起來(lái),降低重復(fù)率,然后就有了以下奇葩的實(shí)驗(yàn):
1)先建立規(guī)則:

2) 然后針對(duì)這些規(guī)則進(jìn)行引用、測(cè)試。

運(yùn)行結(jié)果諸如:

確實(shí)達(dá)到了我期望的結(jié)果…. 本文只是拋磚引玉,可能代碼略挫。各位大俠輕拍,射射。
【實(shí)驗(yàn)前】

【實(shí)驗(yàn)后】
