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

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

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

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

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

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