SuperSpider——打造功能強大的爬蟲利器

SuperSpider——打造功能強大的爬蟲利器

?

博文作者:加菲

發布日期:2013-12-11

閱讀次數:4506

博文內容:

?

1.爬蟲的介紹

圖1-1? 爬蟲(spider)

? ? ??
? ? ? 網絡爬蟲(web spider)是一個自動的通過網絡抓取互聯網上的網頁的程序,在當今互聯網中得到越來越廣泛的使用。這種技術一般用來爬取網頁中鏈接,資源等,當然,更為高級的技術是把網頁中的相關數據保存下來,成為搜索引擎,例如著名的google和百度。常見的爬蟲應用還有像一淘這樣的比價網站,電影推薦網站等。

? ? ? 為了讓大家進一步感受到爬蟲的魅力,筆者編寫了一個爬取淘寶和京東數據的比價網站(http://jiafei.org:8888/),如圖1-2所示。由于淘寶和京東的搜索結果頁面中有部分內容引(如價格)是通過ajax動態獲得的,再用javascript把內容寫入到相應的標簽中的,當搜索Iphone 5s時,后臺爬蟲利用webkit生成去最終的dom樹,爬取有用的數據,經過簡單的處理后返回相應的結果。

?

圖1-2? 一個簡單的比較網站

?

2.為何需要爬蟲

? ? ? 爬蟲對于掃描器來說至關重要,站在整個掃描器的最前線(如圖2-1所示)。在一個專業掃描器中,一般首先會由爬蟲爬取指定的頁面,接著把爬到的url傳遞給調度server,最后由調度server分發需要掃描的url給掃描agent來完成整個掃描過程。

?

圖2-1? 掃描器的組成

?

2.爬蟲的架構與分析

?
? ? ? Web安全對于互聯網公司來說至關重要,為了讓公司的掃描器與業界的掃描器看齊,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.??自動交互

? ? ? 自動交換就是說要模仿出人的行為,例如點擊鼠標,按下回車鍵等,下圖就是一個需要點擊鼠標的例子。


? ? ? 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表現更好

圖4-1? SuperSpider與wvs的結果對比

?

6.結尾


以上筆者的一些思考與總結,歡迎大牛們的意見和建議!

轉載于:https://www.cnblogs.com/mfryf/p/3660640.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377141.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《MySQL——關于grant賦權以及flush privileges》

先上總結圖&#xff1a; 對于賦予權限或者收回權限還是創建用戶&#xff0c;都會涉及兩個操作&#xff1a; 1、磁盤&#xff0c;mysql.user表&#xff0c;用戶行所有表示權限的字段的值的修改 2、內存&#xff0c;acl_users找到用戶對應的對象&#xff0c;將access值修改 g…

對Spring的理解

1、Spring實現了工廠模式的工廠類&#xff0c;這個類名為BeanFactory實際上是一個接口&#xff0c;在程序中通常BeanFactory的子類ApplicationContext。Spring相當于一個大的工廠類&#xff0c;在其配置文件中通過<bean>元素配置用于創建實例對象的類名和實例對象的屬性。…

Java中的null是什么?

As we know null is an important concept in every language not only in Java but here we will study various factors regarding null. 我們知道null在每種語言中都是重要的概念&#xff0c;不僅在Java中&#xff0c;在這里我們還將研究有關null的各種因素。 null is a ver…

《MySQL——分區表小記》

分區表的組織形式 以年份為分割方式&#xff0c;對表進行分割&#xff1a; CREATE TABLE t (ftime datetime NOT NULL,c int(11) DEFAULT NULL,KEY (ftime) ) ENGINEInnoDB DEFAULT CHARSETlatin1 PARTITION BY RANGE (YEAR(ftime)) (PARTITION p_2017 VALUES LESS THAN (201…

實戰Windows下安裝boost

Boost大部分組件無需編譯可直接包含頭文件使用&#xff0c;但還有一些庫需要編譯成靜態庫或動態庫才能使用。可使用下文將提到的bjam工具&#xff1a;bjam --show-libraries 查看必須編譯才能使用的庫。 編譯安裝環境&#xff1a;Win7&#xff0c;VS2008(msvc-9.0) 1. 下載boos…

postgresq dur_DUR的完整形式是什么?

postgresq dur杜爾(DUR)&#xff1a;您還記得嗎&#xff1f; (DUR?: Do You Remember?) DUR? is an abbreviation of "Do You Remember?". DUR&#xff1f; 是“您還記得嗎&#xff1f;”的縮寫。 。 It is an expression, which is commonly used in messaging…

gsettings-desktop-schemas : 破壞: mutter (< 3.31.4) 但是 3.28.4-0ubuntu18.04.2 正要被安裝解決方案

完整報錯&#xff1a; dyydyy-Lenovo-ThinkBook-14-IIL:~$ sudo apt install build-essential 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 有一些軟件包無法被安裝。如果您用的是 unstable 發行版&#xff0c;這也許是 因…

程序內存檢測

本文參考自&#xff1a;http://www.cnblogs.com/hebeiDGL/p/3410188.html static System.Windows.Threading.DispatcherTimer dispacherTimer;static string total "DeviceTotalMemory";static string current "ApplicationCurrentMemoryUsage";static s…

動態規劃天天練1

本來很久以前就打算每天練一道動態規劃題的&#xff0c;但每每由于作業太多而中斷&#xff0c;現在終于停課了......廢話不多說&#xff0c;第一道題就給了我迎頭一棒&#xff0c;不僅想了很久&#xff0c;連題解都看了很久。。。水平相當不足啊啊&#xff0c;不多說廢話&#…

AAS的完整形式是什么?

AAS&#xff1a;活著和微笑 (AAS: Alive And Smiling) AAS is an abbreviation of "Alive And Smiling". AAS是“活著和微笑”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Facebook, Y…

《MySQL 8.0.22執行器源碼分析(1)——execute iterator一些記錄》

目錄一條語句的函數調用棧順序8.0使用迭代器模式改進executorint *handler*::ha_rnd_next(*uchar* **buf*)int *TableScanIterator*::Read()int FilterIterator :: Read&#xff08;&#xff09;int HashJoinIterator::Read()int NestedLoopIterator :: Read&#xff08;&#…

關于autoupgader的狗屎問題

由于win7和xp的權限問題&#xff0c;導致這個自動升級玩意不正常。這個狗屎問題很簡單&#xff0c;把exe文件的兼容性設定該一下。真是氣死灑家了。轉載于:https://www.cnblogs.com/usegear/p/3679097.html

strcspn函數

函數原型&#xff1a;extern int strcspn(char *str1,char *str2) 參數說明&#xff1a;str1為參照字符串&#xff0c;即str2中每個字符分別與str1中的每個字符比較。 所在庫名&#xff1a;#include <string.h> 函數功能&#xff1a;以str1為參照&#xff0c…

c語言 sqlite_SQLite與C語言

c語言 sqliteSQLite數據庫簡介 (Introduction to SQLite database) SQLite is a relational database; it is used for embedded devices. Now a day it is using worldwide for different embedded devices. SQLite是一個關系數據庫。 它用于嵌入式設備。 如今&#xff0c;它已…

《MySQL 8.0.22執行器源碼分析(2)解讀函數 ExecuteIteratorQuery》

函數代碼 bool SELECT_LEX_UNIT::ExecuteIteratorQuery(THD *thd) {THD_STAGE_INFO(thd, stage_executing);DEBUG_SYNC(thd, "before_join_exec");Opt_trace_context *const trace &thd->opt_trace;Opt_trace_object trace_wrapper(trace);Opt_trace_object…

C語言,如何產生隨機數

1. 基本函數 在C語言中取隨機數所需要的函數是: int rand(void);void srand (unsigned int n); rand()函數和srand()函數被聲明在頭文件stdlib.h中,所以要使用這兩個函數必須包含該頭文件: #include <stdlib.h> 2. 使用方法 rand()函數返回0到RAND_MAX之間的偽隨機數(pse…

MongoDB源碼概述——內存管理和存儲引擎

數據存儲&#xff1a; 之前在介紹Journal的時候有說到為什么MongoDB會先把數據放入內存&#xff0c;而不是直接持久化到數據庫存儲文件&#xff0c;這與MongoDB對數據庫記錄文件的存儲管理操作有關。MongoDB采用操作系統底層提供的內存文件映射&#xff08;MMap&#xff09;的方…

OBTW的完整形式是什么?

OBTW&#xff1a;哦&#xff0c;順便說一下 (OBTW: Oh, By The Way) OBTW is an abbreviation of "Oh, By The Way". OBTW是“哦&#xff0c;順便說一下”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media network…

SharePoint 2010 Form Authentication (SQL) based on existing database

博客地址 http://blog.csdn.net/foxdaveSharePoint 2010 表單認證&#xff0c;基于現有數據庫的用戶信息表本文主要描述本人配置過程中涉及到的步驟&#xff0c;僅作為參考&#xff0c;不要僅限于此步驟。另外本文通俗易懂&#xff0c;適合大眾口味兒。I. 開啟并配置基于聲明的…

《MySQL 8.0.22執行器源碼分析(3.1)關于RowIterator》

目錄RowIteratorInit()Read()SetNullRowFlag()UnlockRow()StartPSIBatchMode()EndPSIBatchModeIfStarted()real_iterator()RowIterator 使用選定的訪問方法讀取單個表的上下文&#xff1a;索引讀取&#xff0c;掃描等&#xff0c;緩存的使用等。 它主要是用作接口&#xff0c;但…