2014年1月8日 星期三

網路爬蟲工具larbin,只抓取url清單的使用方法與原始碼分享

我一直想要找一個好用的網路爬蟲工具,但是在網路上找了一些時間,都沒有找到符合我需要的,我想要的是可以給定一些網路範圍,例如 csdn.net,它可以自動並且友善的上網抓取所有網域名稱帶有 csdn.net 的網址,例如:
http://huawei.csdn.net/
http://www.csdn.net/
等等...

Burp suite 不錯,雖然是 java 寫的,但是速度也夠快,關於爬網頁的各種功能都齊全,甚至有很好的 javascript 解譯功能,但是它的致命傷是無法正確解析帶有中文編碼的 URL,例如種花電信上的一個網頁,如下,隨便點一個遊戲的介紹,URL 路徑中就有中文:
http://member.games.hinet.net/apps/

或者是中文的網址,例如:
http://中文.tw/

而且 Burp 裡的 spider 沒有提供直接 URL 清單下載的功能,通常你必須先設定瀏覽器使用 burp 的 proxy (預設是 127.0.0.1:8080),然後瀏覽器連到某個網站,等到 burp 的 proxy 抓到資料後,在透過選單操作,使用 burp spider 來爬網頁,爬完網頁之後,在 burp 的網站清單界面中全選,然後把所有的網頁 URL 複製到剪貼簿記憶體,然後再開個文字編輯器,將剪貼簿的內容貼上。

以上,是不是很繁瑣呢?


larbin 是我找到的一線曙光, 2003 年由一位法國人 Sebastien Ailleret 撰寫, 10 年後 2013 年有一位內地的朋友 (GitHub 代號:ictxiangxin) 開始維護它,謝謝這位高手,以至於我們可以在 GitHub 找到它的可編譯版本,10 年前那個 larbin 原始碼現在的編譯器已經吃不下了,畢竟 C++ 編譯器一直在進步,所以對語法越來越挑剔(?)

我大致看了一些程式碼,說實在目前的 larbin (2.6.4) 也有一些 bug,例如 SIMPLE_SAVE 模式無法正確編譯。但是還是相當不錯!有加入一些方便的功能,而且至少可以無痛編譯完成!

它是一個適合有程式功力的人使用的網路爬蟲,可修改的參數不少,而且有些是透過直接修改程式碼來達到,例如我想要它爬一爬之後,自動吐出 URL 清單到一個目錄裡面,這樣的功能可以相對輕鬆的透過撰寫 4 個 c++ 函式來達成,當然是透過 larbin 既有的程式框架。

有興趣的朋友可以自行參考說明文件以及程式碼。

我在這裡提供我修改過的一個版本,我沒有時間繼續維護它,因此沒有放上 GitHub,僅提供想使用 larbin 的朋友一個參考的選項,如果你有和我同樣的,像上述說的需求,需要爬出一個 URL 清單,那我這個版本比 GitHub 上的更好,不過我不負責維護和後續解bug :P

您可以在這裡下載
md5: 8e0301358e74d1626581350f5fe7a688
sha1: edc5eddd7fcc566b2f185fa899fe6f75d4fd9ff8
最後更新日期:2014.1.8
備註:把原來的記憶體設定改大,所以可以吃下一些大網頁,畢竟 10 年前的網頁普遍比現在小很多。

解壓縮後,直接 ./configure && make 即可產生 larbin 執行檔。在 Ubuntu 13.10 x64 測過無問題。視情況而定,您可能會需要安裝一些套件,例如:
$ sudo apt-get install xutils-dev g++ m4 lynx

直接執行 larbin 是不會有好結果的(疑?),你需要修改一下 larbin.conf,我在目錄下
也放了一個 larbin-url.conf,老話一句,如果你要的是 URL 清單,建議你修改並且使用我這個檔,如果不是,您可以轉台到 GitHub 的頁面去了。 ^_^

打開 larbin-url.conf,您一定需要編輯的參數有以下幾項:
waitDuration 60
startUrl http://www.csdn.net/
CGIOnly
limitToDomain .fr .dk .uk end

startUrl 是您想要爬的起始網址,如果您要爬的網址有幾個,您可以加入很多次,例如:
startUrl http://w1.example.org/
startUrl http://w2.example.org/
startUrl http://www.example.org/

雖然原來官方文件說起始網址不重要,呃,用途不同所以重要性不同,解釋也自然不同。我的目的是要爬特定的網域,並且產生 URL 清單。

CGIOnly 是您是否只要輸出有帶 = 符號的網址,通常代表網址有參數,如果不要,你可以在前面加上 # 註解它,例如:
# CGIOnly

limitToDomain 是你要限制的網域範圍,例如你要抓所有以 example.org 結尾的網址,也就是說要抓 example.org 這個網域下的所有範圍,那你可以在此設定,最後結尾要加個空格然後小寫 end,例如:
limitToDomain example.org end

當然,如果你要限制兩個以上的網域,只要寫在後面即可,例如再加上 example.com,變成:
limitToDomain example.org example.com end

waitDuration 是同一個網站送出兩次請求之間等待的秒數,原來官方文件建議不要低於 30,請忽略這個建議,因為比如說你要爬的網域只有一個網址,例如 www.example.org,那你設定 30 秒,就是每 30 秒才從這個網站抓一個 URL 回來,這實在是禮貌到太疏遠的程度了。如果你只有一個網址,建議你可以設定成 3 或 5,如果你徵詢對方同意,頻寬也足夠,你設定 0 都可以,會超級快。如果你有多個網址,請自行斟酌設定,或者搭配 options.h 裡面的頻寬限制,我的版本是限制 800 Kb/s ,你可以自己修改 options.h 的 MAXBANDWIDTH 參數,如下,單位是 B/s,所以下方就是 800 Kb/s:
#define MAXBANDWIDTH 100000

注意上面的是 C/C++ 的前置處理器指令 #define,它是 options.h 表頭檔案的程式碼,這和 larbin-url.conf 裡的註解 # 是不同的。

在 larbin-url.conf 裡面,其他您可能會想設定的參數還有:
From youremail@example.org
UserAgent Larbin264

From 是你的 email,會隨著 HTTP 要求一起當作表頭送出,所以對方伺服器就會有這筆資料,頻寬被吃了也知道要怪誰 :)

UserAgent 是...,你懂的,看你想要模擬哪一款瀏覽器呢?加上雙引號就可以允許空格了,例如:
UserAgent "A B C..."

編譯完成後,執行 ./larbin -c larbin-url.conf 即可,預設 URL 清單輸出在當前目錄下的 url.log 檔案,瀏覽器打開 http://127.0.0.1:8081 可以看執行狀況,有一些數值可以觀察。

此版本的 larbin 尚未支援以下功能:
1. 解析 javascript,特別是類似 cloudeflare 或者 incapsula 等透過 javascript + cookie 的多重驗證,或者是解析透過 javascript 動態修改網頁中的 URL。
2. 處理 https。
3. 自動送表單 (POST)

針對一般的使用,已經綽綽有餘,祝使用愉快。

沒有留言:

張貼留言