學渣講爬蟲之Python爬蟲從入門到出門(第一講)
目錄
學渣講爬蟲之Python爬蟲從入門到出門第一講
目錄
爬蟲的常用形式
爬蟲的基本原理
前期準備
簡單爬蟲
爬蟲例項
爬蟲的常用形式
生活學習中,我們可能常常會遇到一些需要獲取某類特定資源的情況,比如:
需要若干包含某些個關鍵詞的論文
需要某個行業的資料以用於機器學習或理論分析
需要某支股票的長期走勢以決定是否要入股
需要大量針對某個商品的評論以決定是否要下單
需要大量針對某部電影的影評以決定是否要跟朋友去觀看
···
這時候,爬蟲便是我們快速獲取這些資源的一條有效途徑。
網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。另外一些不常使用的名字還有螞蟻、自動索引、模擬程式或者蠕蟲。(定義源自百度百科 - “網路爬蟲”)
通俗的說,爬蟲就是一個自動化的機器人軟體,按照設定去獲得你想要的網際網路資料,並且整個抓取的過程都是自動完成的。我們所熟知的百度和谷歌兩大搜索引擎的實質也就是爬蟲,它們會不間斷的爬取網際網路上存在的和新出現的內容,並以某種形式儲存到自己的資料庫中。
爬蟲的基本原理
開始-瀏覽網頁-解析網頁-下載資料-儲存資料-清洗資料-結束。
瀏覽網頁:就如同我們人瀏覽網頁一樣,爬蟲需要先向目標地址發起請求,然後等待目標頁面內容全部載入;
解析網頁:一張網頁由許許多多的內容構成,不只是文字,還有圖片、音訊、視訊、HTML程式碼、CSS樣式表、JS指令碼等各種元素,為此,需要一定的規則來定位到我們所需要的具體某個\些元素;
下載資料:在解析出我們需要的部分後,便可以將其下載並暫時儲存到記憶體中;
儲存資料:下載出來的資料可能遠不止一個,而記憶體的空間有限且寶貴,我們需要用到資料庫或其他形式來將下載的資料分類且長期儲存,以便於後面的資料清洗、查詢等各種操作;
清洗資料:下載的資料可能會包含一些無效的、有錯的內容,為此需要對這些內容進行清洗,只保留對我們有價值的東西。之所以將清洗放在儲存後,是因為這裡主要是對已經下載的內容進行處理,需要大量的I\O操作,而爬蟲主要過程由CPU來排程,我們都知道主存的讀寫速度遠高於輔存的讀寫速度,這一步如果放在儲存前面,會極大的限制爬蟲的效率。
前期準備
Python版本簡介
因為本教程主要以Python為實現爬蟲的語言,因此需要安裝Python。Python主要分為Python 2.X和Python 3.X兩大陣營,這兩大版本有很多不一樣,雖然有很多模組還使用2.X這個版本,但也有許多模組漸漸退出了對2.X的更新和支援,未來還是以3.X版本為主流,大部分以2.X為版本的模組也都有了3.X的版本,包括官方的標準庫和第三方庫,因此推薦使用3.X版本進行開發。本教程也以Python 3為開發語言。
Python的安裝:
Python的官方網站為:https://www.python.org/;
截止本文釋出,Python的最新版本為Python 3.6.4,出於穩定性和第三方模組支援的考慮,我選擇安裝一個較為穩定且相容性較好的版本Python 3.5.2;
根據安裝包的提示下一步下一步就可以安裝成功了,在安裝介面上有個”Add Python3.5 To Path”的複選框,勾選變可以自動配置環境變數,如果沒有勾選,也可以手動配置,步驟如下;
(上一步如果勾選了複選框則這一步開始可以跳過)
以安裝路徑為”C:\Program Files (x86)\Python35-32\”為例,這裡將這個路徑複製,然後在桌面找到”此電腦”圖示,右鍵,選擇屬性,開啟”系統面板”,如圖(出於安全形度已將計算機資訊覆蓋)

點選左側紅色框中的”高階系統設定”,開啟”系統屬性”面板,如圖

點選下方的”環境變數”按鈕,開啟”環境變數”面板,如圖(同樣出於安全形度將變數值覆蓋)

在下方”系統變數”裡找到變數名為”Path”的變數,雙擊或點選紅色框裡的編輯按鈕,開啟”編輯環境變數”面板,如圖(同樣出於安全形度將變數值覆蓋)

點選右邊紅色框裡的”新建”按鈕,在左側游標處輸入剛才複製的值”C:\Program Files (x86)\Python35-32\”,再點選一次新建,輸入值”C:\Program Files (x86)\Python35-32\Scripts\”,然後一路確定,直至回到”系統”面板,如圖(同樣出於安全形度將變數值覆蓋)

開啟”CMD”命令列,輸入python,如果出現類似於如圖的結果

則表示配置Python的環境變數成功。
Python 3.5.2安裝包會自動安裝Python包管理工具”pip”,這個工具提供了對Python包的查詢、下載、安裝和解除安裝功能,因為爬蟲的開發需要用到多個Python第三方庫,所以需要用pip對這些包進行集中管理,方便又快捷。開啟命令列,輸入pip,如果顯示類似於如圖的結果

則表示pip已經成功安裝,如果沒有成功安裝pip,則可以使用如下方法:
下載get-pip.py檔案,開啟命令列,切換到”get-pip.py”檔案的儲存位置,輸入命令python get-pip.py,python就會自動安裝pip工具。
推薦開發Python的專業IDE——PyCharm,雖然收費較貴,但是真的很強大很專業,大學生可以申請學生認證,免費使用一年Professional版,每年需要驗證一次,建議使用校園郵箱進行認證,方便且稽核快。
簡單爬蟲
前期準備已經全部完成,開始正式進入到Python爬蟲的世界。
前面我們已經講到,爬蟲大致分為瀏覽網頁、解析網頁、下載網頁、儲存資料、清洗資料這幾個步驟,首先聯想我們以人的角度上網,一般是先開啟瀏覽器,輸入想要瀏覽的URL(統一資源定位器),通俗的說就是網址,然後在頁面上發現我們喜歡的東西,比如一段文字,然後我們就將這段文字複製下來,新建一個TXT檔案或者Doc檔案,將複製的內容貼上上去,儲存。那麼作為一種程式語言,如何用程式碼來實現這一全部過程呢?這時候就需要用到幾個Python的第三方庫了。
首先我們來介紹第一個模組——Requests
Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。Requests 允許你傳送純天然,植物飼養的 HTTP/1.1 請求,無需手工勞動。你不需要手動為 URL 新增查詢字串,也不需要對 POST 資料進行表單編碼。Keep-alive 和 HTTP 連線池的功能是 100% 自動化的,一切動力都來自於根植在 Requests 內部的 urllib3。(解釋源自python-requests.org)
通俗的說,”Requests”是Python的一個HTTP模組,用來進行HTTP請求,並獲得響應結果。就好比我們用瀏覽器訪問百度,這其中就包含了一個HTTP請求,即計算機向百度的伺服器發出訪問請求,百度伺服器經過許可權稽核後通過了這條請求,並返回了百度首頁的HTML程式碼及其他相關檔案,檔案在瀏覽器中組合生成我們所看到的頁面。那麼Requests就是用來發送這條請求並接受返回的結果的。
Requests模組的安裝便由前面所講到的pip工具來完成,幾乎所有的非標準模組(第三方模組)都可以這樣安裝。以管理員許可權開啟CMD命令列,這裡一定要用管理員許可權,尤其是Python安裝在C盤的童鞋,因為系統的保護機制,所以C盤的寫入需要最高階的許可權。執行命令pip install requestes(r小寫),如要獲得原始碼,也可參考http://cn.python-requests.org/zh_CN/latest/user/install.html#pip-install-requests。
爬蟲例項
以爬取百度首頁為例,我們寫一個簡單的爬蟲:
# -*- coding: utf-8 -*- mport requests url = 'http://www.baidu.com' # 註釋1 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' # 註釋2 } response = requests.get(url=url, headers=headers) # 註釋3 content = response.content.decode() # 註釋4 print(content) # 註釋5
註釋1:這裡寫的是URL,即所謂的網址
註釋2:訪問網址的時候HTTP請求的標頭檔案裡都會包含一個User-Agent,這個關鍵字的解釋如下
User Agent中文名為使用者代理,簡稱 UA,它是一個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本、CPU 型別、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等。(解釋源自百度百科 - “使用者代理”)
在爬蟲裡,UA就好比一張通行證,通過偽裝UA標識,可以讓某些爬蟲檢測機制將你的爬蟲當做一個用瀏覽器訪問其網頁的自然人,在錯誤的判斷下,便不對這個爬蟲進行反爬蟲的操作(關於反爬蟲在後面的文章裡我會仔細說明)。當然要真正的達到”通行”的目的,可能要做的遠不止如此。
headers就是剛才所說的HTTP請求裡的標頭檔案,如果將UA比喻成通行證,那麼headers就是你的爬蟲的檔案,它包含了訪問者的裝置資訊,語言資訊,編碼資訊,請求來源資訊等各種內容,它同樣可以偽裝,讓你的爬蟲變成一個”清白”的訪問者,從而讓伺服器返回正確的內容,爬蟲順利的爬取各種想要的資源。UA是這個檔案裡的一條內容。
通常情況下,在獲取某些get請求的內容而非post請求的內容時,我們只需要將UA修改成一般瀏覽器的UA就好了,無需增加其他關鍵字,而UA的獲取將在後面的文章進行講解。
註釋3:response便是通過向目標伺服器進行請求後獲得的響應物件,它作為一個物件,包含了伺服器的響應的全部內容,就好比派遣一個間諜去獲得敵人的內部資料,間諜得手後成功返回,所有的資料都儲存在間諜的身上,那麼這個間諜就是這個響應物件,我們可以從間諜口中得到任何想知道的內容。(比喻可能不太準確)
註釋4:我們將從響應物件那裡得到的內容儲存在名為content的變數裡,response.content,這裡的content是響應物件的一個屬性,用來返回響應包含的內容,有可能是一段HTML程式碼,也可能是一段文字,一張圖片,一首音樂,但都是以bytes型也就是二進位制的形式存在,這裡因為返回的是一段HTML程式碼,因此我們將其解碼,使用到decode()方法,將bytes型轉變為str型,結果如下:

圖中的便是百度首頁的原始碼了。
註釋4:最後輸出如上圖的結果
一個簡單的爬蟲大概就這樣完成了,但這裡可能還不能真正體現爬蟲的便捷和自動化,我將在第二章開始講解較為複雜的爬蟲。