SuperSpider——打造功能强大的爬虫利器
SuperSpider——打造功能強(qiáng)大的爬蟲(chóng)利器
?
博文作者:加菲
發(fā)布日期:2013-12-11
閱讀次數(shù):4506
博文內(nèi)容:
?
1.爬蟲(chóng)的介紹
圖1-1? 爬蟲(chóng)(spider)
? ? ??
? ? ? 網(wǎng)絡(luò)爬蟲(chóng)(web spider)是一個(gè)自動(dòng)的通過(guò)網(wǎng)絡(luò)抓取互聯(lián)網(wǎng)上的網(wǎng)頁(yè)的程序,在當(dāng)今互聯(lián)網(wǎng)中得到越來(lái)越廣泛的使用。這種技術(shù)一般用來(lái)爬取網(wǎng)頁(yè)中鏈接,資源等,當(dāng)然,更為高級(jí)的技術(shù)是把網(wǎng)頁(yè)中的相關(guān)數(shù)據(jù)保存下來(lái),成為搜索引擎,例如著名的google和百度。常見(jiàn)的爬蟲(chóng)應(yīng)用還有像一淘這樣的比價(jià)網(wǎng)站,電影推薦網(wǎng)站等。
? ? ? 為了讓大家進(jìn)一步感受到爬蟲(chóng)的魅力,筆者編寫(xiě)了一個(gè)爬取淘寶和京東數(shù)據(jù)的比價(jià)網(wǎng)站(http://jiafei.org:8888/),如圖1-2所示。由于淘寶和京東的搜索結(jié)果頁(yè)面中有部分內(nèi)容引(如價(jià)格)是通過(guò)ajax動(dòng)態(tài)獲得的,再用javascript把內(nèi)容寫(xiě)入到相應(yīng)的標(biāo)簽中的,當(dāng)搜索Iphone 5s時(shí),后臺(tái)爬蟲(chóng)利用webkit生成去最終的dom樹(shù),爬取有用的數(shù)據(jù),經(jīng)過(guò)簡(jiǎn)單的處理后返回相應(yīng)的結(jié)果。
?
圖1-2? 一個(gè)簡(jiǎn)單的比較網(wǎng)站
?
2.為何需要爬蟲(chóng)
? ? ? 爬蟲(chóng)對(duì)于掃描器來(lái)說(shuō)至關(guān)重要,站在整個(gè)掃描器的最前線(如圖2-1所示)。在一個(gè)專業(yè)掃描器中,一般首先會(huì)由爬蟲(chóng)爬取指定的頁(yè)面,接著把爬到的url傳遞給調(diào)度server,最后由調(diào)度server分發(fā)需要掃描的url給掃描agent來(lái)完成整個(gè)掃描過(guò)程。
?
圖2-1? 掃描器的組成
?
2.爬蟲(chóng)的架構(gòu)與分析
?
? ? ? Web安全對(duì)于互聯(lián)網(wǎng)公司來(lái)說(shuō)至關(guān)重要,為了讓公司的掃描器與業(yè)界的掃描器看齊,server安全組自研了一款功能強(qiáng)大的爬蟲(chóng)——SuperSpider,主要用來(lái)為漏洞掃描提供豐富的urls。SuperSpider的架構(gòu)如圖3-1所示,首先由下載器模塊下載指定的頁(yè)面,分析頁(yè)面模塊分析完成后一方面把需要的數(shù)據(jù)傳遞給存儲(chǔ)模塊,另一方面將爬取的urls傳遞給去重模塊,去重后放到url隊(duì)列中,最后由調(diào)度器安排次序傳遞url給下載器下載新的頁(yè)面。接下來(lái)詳細(xì)講講分析頁(yè)面,調(diào)度器和去重這3個(gè)模塊。
?
圖3-1? 爬蟲(chóng)的架構(gòu)
?
3.1分析頁(yè)面
簡(jiǎn)單的來(lái)說(shuō), 爬蟲(chóng)主要作用就是用來(lái)分析頁(yè)面。
難點(diǎn):因?yàn)楝F(xiàn)在是web2.0時(shí)代,絕大部分網(wǎng)頁(yè)都會(huì)使用javascript處理頁(yè)面,而且很多網(wǎng)頁(yè)內(nèi)容都是通過(guò)Ajax技術(shù)加載的。因此,只是簡(jiǎn)單地解析HTML文件會(huì)遠(yuǎn)遠(yuǎn)不夠。
解決:如何做到這點(diǎn)?編寫(xiě)一個(gè)基于webkit的爬蟲(chóng)SuperSpider。下面將詳細(xì)說(shuō)明SuperSpider所具有的5個(gè)功能強(qiáng)大的爬取能力。
a.??靜態(tài)頁(yè)面鏈接分析
? ? ? 簡(jiǎn)單點(diǎn)來(lái)說(shuō),就是分析html文檔,例如下圖的一個(gè)<a>標(biāo)簽的超鏈接,SuperSpider會(huì)識(shí)別出href中的值為一個(gè)超鏈接,提取其值html_link.php?id=1。
b.? javascript動(dòng)態(tài)解析
? ? ? 下圖為一段javascript代碼,該代碼的目的是在id為hi的a標(biāo)簽中提交屬性href。
? ? ??
? ? ? SuperSpider利用webkit內(nèi)核執(zhí)行以上javascript代碼生成出以下html代碼,再通過(guò)靜態(tài)頁(yè)面鏈接分析獲取js_link.php?id=1&msg=abc這個(gè)url。
c.??自動(dòng)分析表單
? ? ? SuperSpider會(huì)自動(dòng)識(shí)別出action中的值為所提交的地址,提取input標(biāo)簽中的name和value作為參數(shù),最終生成出 post_link.php?id=1&msg=abc 這個(gè)url。
?
d.??自動(dòng)交互
? ? ? 自動(dòng)交換就是說(shuō)要模仿出人的行為,例如點(diǎn)擊鼠標(biāo),按下回車(chē)鍵等,下圖就是一個(gè)需要點(diǎn)擊鼠標(biāo)的例子。
? ? ? SuperSpider會(huì)自動(dòng)識(shí)別出onclick是一個(gè)交換行為,從而執(zhí)行里面的js代碼生成出以下html,從而爬到了 click_link.php?id=1 這個(gè)url。
?
e.? hook所有的網(wǎng)絡(luò)請(qǐng)求
? ? ? 這是一個(gè)ajax請(qǐng)求,有別于以上4種基于dom樹(shù)解析的分析技術(shù),要捉到其請(qǐng)求的url只能通過(guò)hook請(qǐng)求,而webkit文檔中并沒(méi)有提到hook 網(wǎng)絡(luò)請(qǐng)求的方法。于是通過(guò)修改webkit代碼hook住每一個(gè)由webkit發(fā)送出去的請(qǐng)求,從而拿到了 ajax_link.php?id=1&t=1這個(gè)url。
?
3.2調(diào)度器
? ? ? SuperSpider的調(diào)度器使用廣度優(yōu)先搜索策略,具體的邏輯如下圖所示。首先,從入口頁(yè)面1.html中爬到了2.html, 3.html和4.html,依次把它們放到url隊(duì)列中。接著取出2.html,把爬到的5.html和6.html放到url隊(duì)列中,隨后便開(kāi)始爬取3.html,依廣度次序進(jìn)行。
圖3-2-1? 爬蟲(chóng)調(diào)度的廣度優(yōu)先搜索策略
3.3去重
? ? ? 為了掃描的質(zhì)量和效率,需要進(jìn)行去重。例如大部分網(wǎng)站中日期作為其url的組成部分,尤其是門(mén)戶網(wǎng)站。SuperSpider使用將數(shù)字替換成d+的算法對(duì)url進(jìn)行去重。例如,
1.http://video.sina.com.cn/ent/s/h/2010-01-10/163961994.shtml?a=1&b=10
2.http://video.sina.com.cn/ent/s/h/2009-12-10/16334456.shtml?a=12&b=67
對(duì)數(shù)字進(jìn)行模式處理為:
http://video.sina.com.cn/ent/s/h/d+-d+-d+/d+.shtml?a=d+&b=d+
如果鏈接1已經(jīng)爬取過(guò),鏈接2與鏈接1類似, 不重復(fù)爬取。
試驗(yàn)證明這種方法簡(jiǎn)捷高效,漏爬率極低,大大提升掃描器的效率。
?
4.爬蟲(chóng)的具體實(shí)現(xiàn)
a.webkit的易用性
? ? ? 常用的chrome, safari等瀏覽器都是基于webkit內(nèi)核,不過(guò)提起這個(gè)內(nèi)核,大家可能會(huì)覺(jué)得有點(diǎn)龐大艱深。但如果只是對(duì)于應(yīng)用層面來(lái)說(shuō),webkit使用起來(lái)還是挺簡(jiǎn)易的。如圖4-1所示,只需14行便可以寫(xiě)出一個(gè)瀏覽器。
圖4-1? 使用webkit編寫(xiě)的瀏覽器
b.難點(diǎn)解決
問(wèn)題:Webkit需要視窗系統(tǒng)才能正常啟動(dòng),而服務(wù)器一般都沒(méi)有視窗系統(tǒng)的,那么如何在后臺(tái)穩(wěn)定地運(yùn)行webkit?之前是去掉webkit中的圖形渲染,css等與gui有關(guān)的代碼,太麻煩,易出眾多bug。
解決:使用xvfb虛擬出一個(gè)視窗系統(tǒng),只需把a(bǔ)lert, confirm, prompt的代碼注釋掉(因?yàn)闀?huì)讓瀏覽器卡住),簡(jiǎn)單快捷穩(wěn)定。
c.爬蟲(chóng)的邏輯代碼
圖4-2為爬蟲(chóng)的邏輯代碼,在parse函數(shù)里利用webkit生成出來(lái)的dom樹(shù)來(lái)做具體的第三部分所提到的分析邏輯。
圖4-2? 爬蟲(chóng)的邏輯代碼
5.效果
? ? ? SuperSpider與wvs的爬蟲(chóng)對(duì)比,在著名的爬蟲(chóng)測(cè)試平臺(tái)http://demo.aisec.cn/demo/進(jìn)行測(cè)試,該平臺(tái)要求爬蟲(chóng)要完全具備3.1所提到的5個(gè)功能才能爬取到所有的url,上圖為掃描器的爬蟲(chóng),下圖為wvs的爬蟲(chóng), 其中click_link.php (在3.1.d提到)是需要爬蟲(chóng)具有自動(dòng)交換能力才能爬取到的。
結(jié)論:SuperSpider全部都能爬到, 在自動(dòng)交互方面比wvs表現(xiàn)更好
圖4-1? SuperSpider與wvs的結(jié)果對(duì)比
?
6.結(jié)尾
以上筆者的一些思考與總結(jié),歡迎大牛們的意見(jiàn)和建議!
轉(zhuǎn)載于:https://www.cnblogs.com/mfryf/p/3660640.html
總結(jié)
以上是生活随笔為你收集整理的SuperSpider——打造功能强大的爬虫利器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 五一出行北京游玩攻略,去北京哪里比较好玩
- 下一篇: 程序内存检测