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