個人爬蟲技術經歷

1. 前言

爬蟲,這個詞不少朋友第一次聽到,第一感受應該是各類小蟲子,應該不會和某種計算機技術聯繫在一塊兒。我第一次聽到這個詞,就是這樣一個感受。可是當這個這個詞前面加了網絡二字時,瞬間勾起了個人興趣,固然也帶來了疑問。好比,網絡爬蟲是什麼?有什麼用?後來帶着強烈的興趣和疑問,查詢了不少資料,以求搞清除個人疑問。當個人疑問被解決的解決以後,懷着對爬蟲技術崇敬的心情作了一個決定,我要實現一個屬於本身的爬蟲程序。在我作這個決定的時候,時間節點是大三上學期期末。後來,過完寒假,到了大三下學期。我在大三下全學期用了3個月的時間,設計並實現了本身的爬蟲,而且花了5天的間用本身寫的爬蟲採集了100萬個網頁。這是我第一次與爬蟲技術親密接觸,整體感受良好,學到了不少東西。到了大四上學期的期末,到了論文選題的時候了,我選了一個關於全文搜索引擎的論文題目,論文對應的程序由爬蟲和搜索兩個模塊組成。其中爬蟲直接用的開源實現 WebMagic,不過因爲 WebMagic 不符合個人需求,因此我對 WebMagic 源碼進行了必定的改動,以保證爬蟲按照個人要求來執行任務。這是我第二次接觸爬蟲技術,當時感受也不錯,改了別人的源碼,而且新加了一些新東西。改造完別人的爬蟲不久以後,就畢業了,大學生活也結束了。git

以上,是我大學時候所接觸過的爬蟲技術。當我參加工做後,我所在的公司也有爬蟲,我也須要常用。因此從大三下開始接觸爬蟲到如今,算起來也有兩年半的時間了。這兩年多來,從大三開始本身寫爬蟲,大四改造別人的爬蟲,到如今用公司的爬蟲。我在爬蟲方面多多少少仍是積累了一些經驗,也有一點感觸吧。看着本身之前寫的爬蟲的截圖,仍是蠻感嘆的,時間過得真快啊。因此本篇文章我將把我這兩年多使用爬蟲的經歷寫出來,不過僅僅是記事,不會介紹爬蟲相關的原理。接下來我會按照時間順序依次敘述個人爬蟲經歷,好了,開始吧。github

2. 偶遇爬蟲

我在大三上學期期末的時候,開始在自學 Python。當時感受 Python 仍是比較容易的學的,可是經過看書學習的話,基本上看完就忘。對此,我也是頗爲苦惱。因而後來總結緣由,以爲是本身代碼寫的太少,以致於記不住語法。因此就尋思着寫一個稍微複雜的 Python 程序,這樣才能熟悉 Python。因而乎上網找練手項目,找了一圈,多數人都是推薦用 Python 寫爬蟲。但當時以爲爬蟲技術很複雜,因此心裏仍是比較拒絕的,不過既然你們都建議用 Python 寫爬蟲,那就硬着頭皮上吧。因而,在一個風高月黑的夜晚,入坑了。web

在我開始準備寫爬蟲的時候,腦子真是一片空白。在此以前,我歷來沒接觸過爬蟲相關的技術,也沒用過爬蟲框架。在準備階段,我查了很多資料,也寫了不少小例子。準備工做結束後,我對爬蟲相關的原理有了較爲清晰的認識了,對 Python 的網絡相關的庫也相對熟練了不少。因而頗有自信的開始規劃爬蟲的編碼計劃,按照原計劃,預計耗時一個半月能夠完成爬蟲的編碼工做。不過在真正動手寫代碼以後,深深的體會到了「理想很豐滿,現實很骨幹」這句話的含義。因爲當時沒有經驗,編碼過程當中犯了不少錯。從一開始的技術選型到實際編碼過程當中,本身給本身挖了一個又一個的坑。好比在技術選型階段,選擇了一個難度比較大的併發模型,直接提高了開發難度。另外,在編碼的過程當中,也犯了一個比較大的錯誤。即在初版實現還沒發佈前,不斷的加入新功能,致使初版的爬蟲遲遲出不來,項目最終延期。最後我耗費了3個月的時間,才把初版的爬蟲發佈出來,比預計時間多出一倍。固然,儘管犯了不少錯,但最終仍是完成了編寫爬蟲的計劃。總的來講,收穫仍是很大的。後面我會把初版爬蟲所實現的功能點列出來,不過在列以前,先來看看當時爬蟲的一些設計圖。chrome

爬蟲併發模型

圖1 爬蟲併發模型:多進程+協程編程

爬蟲結構圖

圖2 爬蟲結構圖服務器

下面來羅列一下初版爬蟲實現的功能:網絡

  1. 實現了兩種抓取模式,一種是全網抓取,一種是整站抓取
  2. 爲了不 Python GIL 鎖成爲效率的羈絆,選擇了效率恐怖的多進程加協程做爲併發模型
  3. 爲了不 IP 被 ban,實現了一個代理模塊,每一個30分鐘從代理網站上抓取新的代理 IP
  4. 爲了不爬蟲奔潰致使狀態丟失,實現了一個爬蟲狀態的備份機制,每10分鐘備份一次
  5. 爲了不爬蟲陷入某個網站沒法自拔,遂實現了爬蟲爬行深度的功能
  6. 本身造輪子實現一個了 URL 正規化的模塊
  7. 實現了一個 URL 類似性斷定模塊,減小對類似的 URL 進行抓取,提升效率
  8. Python 調試器 PDB 沒法調試進程,因此還要讓爬蟲支持遠程調試
  9. 引入 PhantomJS 解析動態頁面

以上功能點是我在編碼過程當中陸續加入的,這些功能的加入,直接致使了爬蟲初版實現工期嚴重延誤。同時在編碼的過程當中我也踩了不少的坑,固然多數時候都是本身給本身挖的坑,這其中令我印象最深的坑非我選的爬蟲併發模型莫屬了。上面說到了我選擇多進程加協程做爲併發模型,是由於擔憂 Python GIL 鎖會限制多線程模型的效率。這個模型不用還好,用了以後感受多太複雜了。首先使用多進程增長了調試的難度,必需要使用遠程調試。其次若是使用協程,基本能夠告別調試了,協程調試起來很容易亂掉,因此只能靠打日誌。這都不算什麼,最坑的是當時我代碼中的協程邏輯不按照預期運行,協程切換很詭異,調試了三天也沒找到緣由。最後實在沒辦法,上網求助。最後在知乎上找到了一個 Python 大神,請他在他的電腦上運行個人代碼,看看是否正常。結果他那邊回郵件說正常,並將打印的日誌截圖給我。這個就讓我很鬱悶了,最後這個問題怎麼解決的我也忘了,應該是改代碼規避了。還有其餘一些坑,這裏就很少說了。多線程

在個人爬蟲寫完並測試好後,就開始正式採數據。個人計劃是採集100萬個網頁,並對採集結果進行一些簡單的數據分析。當個人爬蟲在我那4M的網速上吭哧吭哧的運行了5天以後,數據採集終於完成了。採集的過程當中,我也是兢兢業業,天天上完課立馬跑回寢室看看爬蟲的運行狀態,生怕爬蟲掛了。我清楚的記得當數據採集到九十多萬條時,我幾乎沒離開本身的座位,全程盯着爬蟲採完餘下的幾萬條數據。待到爬蟲採集數量達到100萬條時,當時興奮的差點沒從座位上跳起來,實在太開心了。如今回想起來,也仍是比較欣慰的。當時感受真的不容易,那段時間除了上課,剩下全部的空閒時間都拿來寫代碼(BUG)了。最關鍵的是,整個編碼過程至始至終只有我一我的參與,沒有隊友。固然,這並不算什麼。可是若是一旦碰到比較難的問題,一我的就很鬱悶了,連個討論的人都沒有,只能一我的去想辦法解決。好在皇天不負有心人,最終仍是完成了。雖然當時花了這麼長的時間,僅僅實現了一個較爲簡單的爬蟲。但對於當時的我來講,這已經夠了,我從這個過程當中仍是學到了不少東西。同時,這也是我大學生活一段令我印象深入的經歷,無論怎麼說,都值得了。併發

上面嘮嘮叨叨的說了不少,不過這仍然不是所有,還有不少細節我已經想不起來了。接下來,給你們看看我當時寫的爬蟲的樣子吧,很簡陋,見笑了。框架

爬蟲啓動界面

圖3 爬蟲啓動界面

爬蟲運行界面

圖4 爬蟲運行界面

你們能夠看到「圖3 爬蟲啓動界面」中的 wormhole 字樣,wormhole 也就是個人爬蟲名稱,這個是我一個字母一個字母敲出來的。圖4是在爬蟲運行了5個小時以後截取的,裏面包含了任務總數、完成的任務數、採集失敗的頁面數量和比例、以及當前的採集速度等的。如今看看這兩張圖,內容雖間簡陋,但感受仍是很親切的。另外,在爬蟲完成抓取任務後,我還煞有介事的對採集到的數據進行了一些簡單的分析。好比不一樣網站所使用的操做系統、腳本語言以及服務器軟件分佈比例等。以下:


圖5 數據分析

上面的數據分析是依賴於消息頭進行的,但這樣並不精確。因此參考價值不大,不過也仍是有點意思的。

以上就是我與爬蟲技術第一次親密接觸的過程,此次的接觸,令我印象深入。在編寫爬蟲的過程當中,不但達到了最初的目的--熟悉 Python 編程,也順帶學習了不少技術。好比 MongoDB、Bloom Filter、協程等等。儘管寫這個爬蟲耗費了我三個月時間,但從最後的收益來看,這筆投資仍是很值得的。若是用大學裏常常聽到的一句話總結,那就是:「這波不虧」。

好了,偶遇爬蟲篇,就先說到這了。接下來再來講說大四的利用爬蟲作畢業設計的事情。

3. 改造開源爬蟲突擊畢業論文

時間過得很快,在我寫完本身的爬蟲不就,大三就結束了。緊接着到了大四,大四上學期快結束時,咱們要進行畢業論文選題了。對於畢業論文選題這個事情,我當時的想法很簡單。必定要選一個看起來稍微複雜一點的論文,而後認真完成,並以此論文來爲個人大學生活畫上句號。因此思考良久,最終選了基於 Lucene 的全文搜索引擎做爲畢設。固然選完以後,我就開開心心的跑出去實習去了,沒再管它了。以致於在畢業答辯的前一個半月,答辯老師讓咱們提交答辯申請表的時候,我纔想起來還有畢業論文和設計沒準備這回事。因而這就悲劇了,總共一個半月的時間,要留一週的時間進行論文查重和修改,同時答辯前一週還要提交論文最終版,因此真正留給我作畢業設計的時間只有一個月。當時真是急死了,因而最後和公司申請在上班時間寫畢業設計,好在公司答應了個人申請,就這樣我用了一個月的完成了畢業論文和設計。

前面說了,個人畢業論文是關於全文搜索引擎的。看起來並不複雜,調調 Lucene API 就行了。可是,搜索引擎須要數據,而數據又須要拿爬蟲去採集。因此個人畢業設計裏不止要實現搜索邏輯,還要附帶實現數據採集邏輯。固然因爲時間緊急,加上大三寫的爬蟲跑不起來了,因此就直接找開源的爬蟲框架採數據了。找了一圈,最終選定了黃義華大神寫的 WebMagic 做爲個人數據採集工具。儘管當時 Nutch 爬蟲是更好的選擇,可是 Nutch 仍是比較複雜的。爲了防止出岔子,就選了相對比較簡單的 WebMagic。不過考慮到 WebMagic 工做模式不適合爲搜索引擎採集數據,爲了能讓 WebMagic 符合個人需求,因此後來我對 WebMagic 源碼進行了必定的改動。這樣它就能同時採集不少個網站的數據,而且在發現新的網站後也會放在任務隊列中,而不是像之前那樣直接過濾掉。在 WebMagic 改造工做接近尾聲時,我用 ExtJS 爲 WebMagic 作了簡陋的後臺管理界面,方便我對採集過程進行監視。至於當時我是怎麼改動 WebMagic 源碼的,這裏就不細說了,我也忘記了。關於改造 WebMagic 的事情就說到這裏,下面來看看爬蟲的結構圖以及管理界面:


圖6 畢業設計爬蟲模塊運行界面圖

圖7 畢業設計爬蟲模塊運行界面圖

圖8 新增任務圖

最後再上兩張畢業設計中搜索模塊的界面,以下:

圖9 搜索引擎首頁

圖10 搜索引擎結果頁

以上是我在作畢業設計時,所接觸過的爬蟲。雖然並沒什麼亮點,可是在一個月內的時間裏,改造別人的開源爬蟲,並採集20W條數據,緊接着編寫搜索邏輯,最後寫畢業論文。整個過程到如今想一想,仍然仍是很刺激的。好在最後完成了,最終也達到了選題的初衷--經過認真完成畢業論文和設計,爲大學生活畫上句號。

4. 維護公司爬蟲

大學畢業以後,我又是回到了先前實習的公司,並在拿到畢業證後轉正了。由此,個人工做生涯開始了。

咱們公司是以給客戶提供搜索服務起家的,既然是搜索服務,天然也離不開爬蟲。公司的爬蟲和業務貼合的比較近,相對於通用爬蟲來講,公司定製的爬蟲仍是要複雜的多。擁有不少通用爬蟲沒有的功能,好比對列表頁和詳情頁的識別、對網頁正文的抽取(相似印象筆記的剪藏插件)等。同時,不一樣於通用爬蟲,咱們不少時候在採集客戶的數據(客戶不對咱們開放數據)時,常常須要處理各類由 JS 渲染的分頁以及 Ajax 請求等狀況。這類數據爬蟲採集不了,這時候就須要人工參與了。怎樣讓人和爬蟲協做,這也不是個簡單問題。咱們公司的爬蟲參考了 Nutch 的設計思想,因此也爲爬蟲實現了一個插件機制,這樣就解決了人和爬蟲協做的問題。固然具體怎樣實現的,這裏就不說了,詳細能夠參考 Nutch 的插件機制。

在我來到公司以前,公司的爬蟲就已經存在了。在我一開始工做的時候,感受公司的爬蟲仍是很高大上的,看起來挺複雜的。不過如今看來,也就通常了。設計思想還能夠,但易用性不佳。不少能夠自動化解決的問題,竟然一直都是以人工的方式處理的。舉個例子,有一次,咱們公司的運維要檢查爬蟲抓取的數據是否完整。因而他按照慣例到客戶的網站上,從不一樣的欄目裏複製幾條數據的 url。而後再將這幾條 url 一條一條的複製到爬蟲控制檯的搜索框中,看看能不能查找這條 url 的採集記錄。這個過程相對來講仍是比較繁瑣的,特別檢查多個網站數據的數據採集狀況時,尤其的繁瑣,效率十分低下。因此後來我實在看不下去了,就寫了一個 chrome 插件,並在爬蟲後臺開放一組接口。這樣利用插件批量將頁面中的 url 發送給後臺,後臺檢測完後,再將結果返回給 chrome 插件。插件根據檢測結果,把未爬蟲採集的數據標題標紅,並加上刪除線。這樣哪些數據未被採集,一目瞭然,不再用手動檢查了,效率也大大的提升了。

公司現有的爬蟲平臺已經比較老了,有兩三年了,目前看來已經沒法知足業務的需求了。雖然當時在設計上參考了 Nutch 的實現,但也只借鑑了思想,並未借鑑 Nutch 的實現。加之設計之初的技術選型有問題,選用了一些比較底層的技術,致使維護起來很困難。這裏並非說底層技術很差,而是咱們公司沒把它用好。因此公司的爬蟲自從寫出來後,幾乎沒更新過,只是偶爾打個 patch,僅此而已。因此你們在作技術選型的時候,好事要慎重考慮,否則之後維護工做是個大麻煩。關於公司的爬蟲就說到這裏,保密緣由,這裏就不貼圖了。

5. 寫在最後

以上就是我這兩年多學習並使用爬蟲的歷程,雖無什麼亮點,可是對我來講卻會比較難忘。從之前不知爬蟲爲什麼物,到今天能夠用爬蟲作不少事情。總的來講,仍是有比較大的進步吧。固然,我並不非專業的爬蟲工程師,使用爬蟲也只是平時工做的一部分而已。不過即便如此,我仍然以爲數據採集工做並非個輕鬆的差事,很繁瑣。固然了,如今除了工做須要,其餘時間我幾乎不會再關注爬蟲技術了。我並不打算成爲爬蟲工程師,因此這方面的技術夠用就好了。也由於此,寫下這篇文章記錄本身的過往經歷,也算是給本身的爬蟲之路畫上一個句號吧。over!

本文在知識共享許可協議 4.0 下發布,轉載請註明出處
做者:coolblog
爲了得到更好的分類閱讀體驗,
請移步至本人的我的博客: http://www.coolblog.xyz

cc
本做品採用知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議進行許可。

相關文章
相關標籤/搜索