網絡爬蟲的基本概念和認知
1. 爬蟲的定義
網絡爬蟲(又稱為網頁蜘蛛,網絡機器人,在 FOAF 社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲?!?百度百科定義 詳細定義參照
慕課網注解: 爬蟲其實是一種自動化信息采集程序或腳本,可以方便的幫助大家獲得自己想要的特定信息。比如說,像百度,谷歌等搜索引擎,他們的背后重要的技術支撐就是爬蟲。當我們使用搜索引擎搜索某一信息的時候,展現在我們眼前的搜索結果,就是爬蟲程序事先從萬維網里爬取下來的。我們之所以稱之為爬蟲,只不過是對自動獲取萬維網的動作的形象比喻而已。
2. 爬蟲的流程架構
爬蟲大致的工作流程如下圖所示:首先獲取數據,然后對數據進行清洗和處理,最后對數據進行持久化存儲,以及后面的數據可視化工作。后面的章節中,我們會按照這個流程,詳細的一一介紹。
3. 爬蟲的分類
爬蟲按照系統結構和實現技術,大致可以分為以下幾種類型:
3.1 通用網絡爬蟲(General Purpose Web Crawler)
通用爬蟲,主要是指谷歌,百度等搜索引擎。它們爬取的范圍廣,種類多,存儲的信息量大,對技術的要求比較高。
3.2 聚焦網絡爬蟲(Focused Web Crawler)
聚焦爬蟲,主要是根據特定的主題進行爬取。這是大家最長使用的爬蟲種類。比如,我們爬取金融類的,或者電影,圖書之類的特定信息。由于我們限定了主題和網站,可以極大的節省我們的硬盤和網絡資源,更好的滿足特定業務的需求。
3.3 增量式網絡爬蟲(Incremental Web Crawle)
增量爬蟲,主要是指我們在周期性的爬取一些網站的時候,只是僅僅爬取網站變更的內容,而不是把所有網站數據重新爬取一遍。這樣,可以有效的降低運維成本。
3.4 深層網絡爬蟲(Deep Web Crawler)
深層網絡爬蟲,主要是指我們不能直接爬取的一些網站。比如,這些網站需要用戶登陸,或者填寫一些特定的表單,才能繼續深入爬取信息。
Tips : 其實在實際的項目中,我們通常會將兩種甚至多種爬蟲技術相結合來使用,以達到更好的效果。
4. 爬蟲的抓取策略
爬蟲根據業務需求的不同可以大致分為兩種不同的抓取策略:
4.1 深度優先策略
深度優先策略是指爬蟲在爬取一個 HTML 頁面的時候,如果發現頁面中有新的 URL,將對這個新的 URL 進行深度優先搜索,以此類推,一直沿著 URL 進行爬取,直到不能深入為止。然后,返回到上一次的 URL 地址,尋找其他 URL 進行搜索,當頁面中沒有新的 URL 可以供選擇的時候,說明搜索已經結束。
舉一個簡單的例子,比如,我們訪問慕課網,假設慕課網首頁只有兩個課程鏈接,一個是爬蟲課,另一個是 Python 課,深度優先算法就是先進入到爬蟲課中,然后再進入到爬蟲課的一個章節鏈接中,如果這個章節里沒有了子章節,爬蟲就會退到上一層,從另一個沒有訪問過的章節繼續訪問,所有章節都訪問完了,爬蟲會退回到首頁,對 Python 課鏈接也執行相應的搜索,直到無法找到新的 URL 進行搜索而結束。
4.2 廣度優先策略
廣度優先策略是指爬蟲需要爬取完整個 web 頁面的所有 URL 后,才能繼續到下一個的頁面進行搜索,直到底層為止。
還是上面我們的慕課網的例子,來到慕課網首頁之后我們需要獲取到慕課網首頁的 Python 課和爬蟲課的URL 后,才能繼續對這兩個課的子章節的 URL 進行搜索,然后一層一層的進行下去,直到結束。
Tips:深度優先適合搜索網站嵌套比較深的網站,而廣度優先策略更適用于對時間要求比較高,且網站頁面同層次 URL 比較多的頁面。
5. 爬蟲的學習基礎
學習爬蟲,我們需要如下的基礎知識:
- Python 語言基礎
- 數據庫基礎知識
如果大家還沒有 Python 語言或者數據庫的基礎,可以參考慕課網相關的 wiki 進行學習。
當然,為了方便大家理解,我會在代碼中加入詳細的注釋,即使大家沒有 Python 語言基礎,也可以先理解大致流程,然后查漏補缺,學習相應的知識。
有些同學也許會疑惑,為什么開發爬蟲一定要使用python語言呢,其他語言不可以嗎?
這就不得不說 Python 的第三方的庫了,Python 之所以那么流行,正式因為它有非常多的庫,且這些庫性能和使用都比較簡潔高效,配合著 Python 語言本身的高效,僅僅需要 10 行代碼左右就可實現一個簡單的爬蟲,而用 java/C/C++ 等其他語言,至少要寫幾十行代碼,因此,使用 Python 開發爬蟲程序贏得了眾多程序員的青睞。
舉個例子,比如,大家習慣了在樓下的便利店買飲料喝,雖然門口一公里外有更大的超市,我相信你也不愿意去買,因為太麻煩不夠便利。這正是 Python 語言成為爬蟲屆的主流語言的精髓所在。
后面的學習中,我們會用到幾個 Python 的第三方庫,所謂第三方庫,指的是相對于 Python 的官方庫而言(例如,系統“os”,時間“time”等庫\),由非官方發布的庫,如 requests 等庫,我們稱之為第三方庫。
Python 的官方庫在安裝 Python 解釋器的時候已經默認安裝好了,而第三方庫需要我們去手動安裝。例如我們在爬蟲開發中會經常用到的 Requests
庫。安裝第三方庫非常的簡單,只需要在終端中執行下面這條命令即可:
pip install requests
后面,再講到具體的庫的時候,還會進行詳細的介紹。
下面列舉了一下爬蟲開發中常用的 Python 的庫的對比:
包 | 簡介 |
---|---|
urllib | python自帶的庫,不需要安裝。 但是,urlib 在不同的 python 版本中,存在明細的區別,在實際開發中,太過繁瑣,而且無法對 header 偽裝,容易被封掉,所以,現在使用的人數不是很多。 |
requests | 與 urllib 相比,不僅具備了 url 的所用功能,更重要的的語法簡潔優雅,而且,在兼容上, 完全兼容python2 和 python3,非常方便。 同時,它也可以對請求進行偽裝。 |
urllib3 | urllib3 庫提供一些 urllib 沒有的重要特性,比如說線程安全,連接池,支持壓縮編碼等。 |
這里推薦使用 requests 庫,簡單方便,上手容易,對于使用爬蟲的新手來說,非常的合適。如果沒有特殊說明,我們后面的課程默認使用 requests 庫。
6. 爬蟲的法律和道德問題
最近幾年,因為編寫爬蟲程序大量抓取數據獲利的程序員可以說是層出不窮。大家可能會擔心自己在使用爬蟲的過程中會不會違法。其實,大家只要合理的使用爬蟲,是不會輕易觸犯法律的。那么,怎樣才算是合理使用爬蟲呢,我總結了以下三點供大家參考:
- 不能通過爬蟲,高頻率高并發的對特定網站進行攻擊,導致目標網站崩潰;
- 在爬取網站公共數據的時候,如果想把大數據用作商業用途,需要請專業的法務對網站的協議和聲明進行分析確認后再使用;
- 如果通過爬蟲訪問一些不是公開的資源數據,比如需要特定賬號和密碼登陸的網站,然后把數據公開出去,這些大部分都是違法的,即使是使用自己的賬號密碼登陸。
拋開法律層面,我們也要嚴于律己,遵守一些特定的規則辦事。我這里想講的就是爬蟲界的 robots 協議。這個是網站所有者,針對爬蟲而設計的協議,通常位于網站的根目錄下面。它規定了哪些目錄可以爬取,哪些不可以。我們需要遵守這項約定的協議,以避免造成不必要的麻煩。
7. 個人經驗
在實際的工作項目中,如果我們是做爬蟲工作的工程師,在熟練掌握基本的爬蟲技術的同時,還應該去熟悉和了解數據清洗和處理技術,只有這樣,我們才能更好的與團隊進行協作。當然,這些技術,在后面的章節里,我也會一一跟大家進行介紹。
好了,讓我們開啟爬蟲世界的歡樂旅途吧!