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

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

2) 然后針對這些規則進行引用、測試。

運行結果諸如:

確實達到了我期望的結果…. 本文只是拋磚引玉,可能代碼略挫。各位大俠輕拍,射射。
【實驗前】

【實驗后】
