1.爬蟲的介紹
javascript
圖1-1 爬蟲(spider)php
網絡爬蟲(web spider)是一個自動的經過網絡抓取互聯網 上的網頁的程序,在當今互聯網 中獲得愈來愈普遍的使用。這種技術通常用來爬取網頁中連接,資源等,固然,更爲高級的技術是把網頁中的相關數據保存下來,成爲搜索引擎 ,例如著名的google和百度 。常見的爬蟲應用還有像一淘這樣的比價網站,電影推薦網站等。
css
爲了讓你們進一步感覺到爬蟲的魅力,筆者編寫了一個爬取淘寶 和京東數據的比價網站(http://jiafei.org:8888/),如圖1-2所示。因爲淘寶 和京東的搜索結果頁面中有部份內容引(如價格)是經過ajax動態得到的,再用javascript把內容寫入到相應的標籤中的,當搜索iphone 5s時,後臺爬蟲利用webkit生成去最終的dom樹,爬取有用的數據,通過簡單的處理後返回相應的結果。
html
圖1-2 一個簡單的比較網站java
2.爲什麼須要爬蟲
web
爬蟲對於掃描器來講相當重要,站在整個掃描器的最前線(如圖2-1所示)。在一個專業掃描器中,通常首先會由爬蟲爬取指定的頁面,接着把爬到的url傳遞 給調度server,最後由調度server分發須要掃描的url給掃描agent來完成整個掃描過程。ajax
圖2-1 掃描器的組成算法
2.爬蟲的架構與分析chrome
web安全對於互聯網 公司來講相當重要,爲了瀏覽器
此文來自: 馬開東博客 轉載請註明出處 網址: http://www.makaidong.com
讓 公司的掃描器與業界的掃描器看齊,server安全組自研了一款功能強大的爬蟲——superspider,主要用來爲漏洞掃描提供豐富的urls。 superspider的架構如圖3-1所示,首先由下載器模塊下載指定的頁面,分析頁面模塊分析完成後一方面把須要的數據傳遞給存儲模塊,另外一方面將爬 取的urls傳遞給去重模塊,去重後放到url隊列中,最後由調度器安排次序傳遞url給下載器下載新的頁面。接下來詳細講講分析頁面,調度器和去重這3 個模塊。
圖3-1 爬蟲的架構
3.1分析頁面
簡單的來講, 爬蟲主要做用就是用來分析頁面。
難點:由於如今是web2.0時代,絕大部分網頁都會使用javascript處理頁面,並且不少網頁內容都是經過ajax技術加載的。所以,只是簡單地解析html文件會遠遠不夠。
解決:如何作到這點?編寫一個基於webkit的爬蟲superspider。下面將詳細說明superspider所具備的5個功能強大的爬取能力。
a. 靜態頁面連接分析
簡單點來講,就是分析html文檔,例以下圖的一個<a>標籤的超連接,superspider會識別出href中的值爲一個超連接,提取其值html_link.php?id=1。
b. javascript動態解析
下圖爲一段javascript代碼,該代碼的目的是在id爲hi的a標籤中提交屬性href。
superspider利用webkit內核執行以上javascript代碼生成出如下html代碼,再經過靜態頁面連接分析獲取js _link.php?id=1&msg=abc這個url。
c. 自動分析表單
superspider會自動識別出action中的值爲所提交的地址,提取input標籤中的name和value做爲參數,最終生成出 post_link.php?id=1&msg=abc 這個url。
d. 自動交互
自動交換就是說要模仿出人的行爲,
此文來自: 馬開東博客 轉載請註明出處 網址: http://www.makaidong.com
例如點擊鼠標,按下回車鍵等,下圖就是一個須要點擊鼠標的例子。
superspider會自動識別出onclick是一個交換行爲,從而執行裏面的js 代碼生成出如下html,從而爬到了 click_link.php?id=1 這個url。
e. hook全部的網絡請求
這是一個ajax請求,有別於以上4種基於dom樹解析的分析技術,要捉到其請求的url只能經過hook請求,而webkit文檔中並無提到hook 網絡請求的方法。因而經過修改webkit代碼hook住每個由webkit發送出去的請求,從而拿到了 ajax_link.php?id=1&t=1這個url。
3.2調度器
superspider的調度器使用廣度優先搜索策 略,具體的邏輯以下圖所示。首先,從入口頁面1.html中爬到了2.html, 3.html和4.html,依次把它們放到url隊列中。接着取出2.html,把爬到的5.html和6.html放到url隊列中,隨後便開始爬取 3.html,依廣度次序進行。
圖3-2-1 爬蟲調度的廣度優先搜索策略
3.3去重
爲了掃描的質量和效率,須要進行去重。例如大部分網站中日期做爲其url的組成部分,尤爲是門戶網站。superspider使用將數字替換成d+的算法對url進行去重。例如,
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
對數字進行模式處理爲:
http://video.sina.com.cn/ent/s/h/d+-d+-d+/d+.shtml?a=d+&b=d+
若是連接1已經爬取過,連接2與連接1相似, 不重複爬取。
試驗證實這種方法簡捷高效,漏爬率極低,大大提高掃描器的效率。
4.爬蟲的具體實現
a.webkit的易用性
經常使用的chrome, safari等瀏覽器都是基於webkit內核,不過提起這個內核,你們可能會以爲有點龐大艱深。但若是隻是對於應用層面來講,webkit使用起來仍是 挺簡易的。如圖4-1所示,只需14行即可以寫出一個瀏覽器。
圖4-1 使用webkit編寫的瀏覽器
b.難點解決
問題:webkit須要視窗系統才能正常啓動,而服務器通常都沒有視窗系統的,那麼如何在後臺穩定地運行webkit?以前是去掉webkit中的圖形渲染,css等與gui有關的代碼,太麻煩,易出衆多bug。
解決:使用xvfb虛擬出一個視窗系統,只需把alert, confirm, prompt的代碼註釋掉(由於會讓瀏覽器卡住),簡單快捷穩定。
c.爬蟲的邏輯代碼
圖4-2爲爬蟲的邏輯代碼,在parse函數裏利用webkit生成出來的dom樹來作具體的第三部分所提到的分析邏輯。
圖4-2 爬蟲的邏輯代碼
5.效果
superspider與wvs的爬蟲對比,在著名的爬蟲測試 平臺http://demo.aisec.cn/demo/進行測試,該平臺要求爬蟲要徹底具有3.1所提到的5個功能才能爬取到全部的url,上圖爲掃 描器的爬蟲,下圖爲wvs的爬蟲, 其中click_link.php (在3.1.d提到)是須要爬蟲具備自動交換能力才能爬取到的。
結論:superspider所有都能爬到, 在自動交互方面比wvs表現更好
var url = window.location.href;document.write("此文連接:"+url+"