網路爬蟲的實現

2021-06-21 17:16:25 字數 1261 閱讀 9606

網路爬蟲常常被人所忽略,特別是和搜尋引擎的光環相比,它似乎有些暗淡無光。我很少看見有詳細介紹爬蟲實現的文章或者文件。然而,爬蟲其實是非常重要的乙個系統,特別是在今天這個資料為王的時代。如果你是乙個剛剛開始的公司或者專案,沒有任何原始的資料積累,那麼通過爬蟲去internet上找到那些有價值的資料再進行資料的清洗和整理,是乙個可以快速得到資料的重要手段。

此外,既然本文側重於系統方面的問題,那麼某些內容就不會涉及,比如如何抓取那些隱藏的web資料,如何抓取ajax的頁面,如何動態調整抓取頻率等等。

正文fetcher和dns resolver

。另外,對於dns的解析結果也會快取下來,大大降低了dns解析的操作。

content seen

。至於如果判斷兩個網頁的內容是否一致,一般的思路是這樣的:並不會去直接比較兩個網頁的內容,而是將網頁的內容經過計算生成fingerprint(指紋),通常fingerprint是乙個固定長度的字串,要比網頁的正文短很多。如果兩個網頁的fingerprint一樣,則認為它們內容完全相同。

extractor和url filter

。url seen

。(content seen其實也存在這個問題)

url set

當url經過前面的一系列處理後就會被放入到url set中等待被排程抓取。因為url的數量很大,所以只有一小部分可能被放在記憶體中,而大部分則會寫入到硬碟。一般url set的實現就是一些檔案或者是資料庫。

url frontier

frontier(為什麼叫這個名字我也不清楚)之所以放在最後,是因為它可以說是整個爬蟲系統的引擎和驅動分布式

當單機版的爬蟲效能不能滿足要求的時候,就應該考慮用多台機器組成分布式的爬蟲系統。分布式的爬蟲架構其實要比想象的簡單得多,乙個樸素的做法是:假設有n臺機器,每台機器上有執行了乙個完整的爬蟲系統,每台機器的爬蟲在從extractor模組獲得新的url之後,根據url的網域名稱進行hash然後取模n得到結果n,然後該url會被放入第n臺機器的url set中。這樣,不同**的url會被放在不同的機器上處理。

以上就是乙個完整爬蟲的系統實現。當然,由於篇幅有限迴避了一些細節。比如爬蟲抓取每個**前需要先讀取該**的robots.txt來判斷該**是否允許被抓取(前段時間京東就在robots.txt中將一淘的爬蟲遮蔽了,需要說明的是,robots.txt只是乙個業內約定,它並不能從技術上強制的拒絕爬蟲的抓取);再比如,一些**提供了sitemap,這樣可以直接從sitemap上獲取該**的所有url;等等。

JAVA網路爬蟲的實現

記得在剛找工作時,隔壁的一位同學在面試時豪言壯語曾實現過網路爬蟲,當時的景仰之情猶如滔滔江水連綿不絕。後來,在做搜尋時,需要大量的測試,因此萌生了從amazon中爬取圖書封面的想法,從網上也吸取了一些前人的經驗,實現了乙個簡單但足夠用的爬蟲系統。img 傳統爬蟲從乙個或若干初始網頁的url開始,獲得...

JAVA 實現網路爬蟲

class bde image src width 560 height 314 pic type 0 public class task implements runnable override public void run image.write buf,0,len 儲存到本地 image.c...

簡述網路爬蟲的系統實現

網路爬蟲常常被人所忽略,特別是和搜尋引擎的光環相比,它似乎有些暗淡無光。我很少看見有詳細介紹爬蟲實現的文章或者文件。然而,爬蟲其實是非常重要的乙個系統,特別是在今天這個資料為王的時代。如果你是乙個剛剛開始的公司或者專案,沒有任何原始的資料積累,那麼通過爬蟲去internet上找到那些有價值的資料再進...