1. 程式人生 > 實用技巧 >Python爬蟲的基本原理

Python爬蟲的基本原理

我們可以把網際網路比作一張大網,而爬蟲(即網路爬蟲)便是在網上爬行的蜘蛛。把網的節點比作一個個網頁,爬蟲爬到這就相當於訪問了該頁面,獲取了其資訊。可以把節點間的連線比作網頁與網頁之間的連結關係,這樣蜘蛛通過一個節點後,可以順著節點連線繼續爬行到達下一個節點,即通過一個網頁繼續獲取後續的網頁,這樣整個網的節點便可以被蜘蛛全部爬行到,網站的資料就可以被抓取下來了。

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!


QQ群:101677771

1. 爬蟲概述

簡單來說,爬蟲就是獲取網頁並提取和儲存資訊的自動化程式,下面概要介紹一下。

(1) 獲取網頁

爬蟲首先要做的工作就是獲取網頁,這裡就是獲取網頁的原始碼。原始碼裡包含了網頁的部分有用資訊,所以只要把原始碼獲取下來,就可以從中提取想要的資訊了。

前面講了請求和響應的概念,向網站的伺服器傳送一個請求,返回的響應體便是網頁原始碼。所以,最關鍵的部分就是構造一個請求併發送給伺服器,然後接收到響應並將其解析出來,那麼這個流程怎樣實現呢?總不能手工去擷取網頁原始碼吧?

不用擔心,Python提供了許多庫來幫助我們實現這個操作,如urllib、requests等。我們可以用這些庫來幫助我們實現HTTP請求操作,請求和響應都可以用類庫提供的資料結構來表示,得到響應之後只需要解析資料結構中的Body部分即可,即得到網頁的原始碼,這樣我們可以用程式來實現獲取網頁的過程了。

(2) 提取資訊

獲取網頁原始碼後,接下來就是分析網頁原始碼,從中提取我們想要的資料。首先,最通用的方法便是採用正則表示式提取,這是一個萬能的方法,但是在構造正則表示式時比較複雜且容易出錯。

另外,由於網頁的結構有一定的規則,所以還有一些根據網頁節點屬性、CSS選擇器或XPath來提取網頁資訊的庫,如Beautiful Soup、pyquery、lxml等。使用這些庫,我們可以高效快速地從中提取網頁資訊,如節點的屬性、文字值等。

提取資訊是爬蟲非常重要的部分,它可以使雜亂的資料變得條理清晰,以便我們後續處理和分析資料。

(3)儲存資料

提取資訊後,我們一般會將提取到的資料儲存到某處以便後續使用。這裡儲存形式有多種多樣,如可以簡單儲存為TXT文字或JSON文字,也可以儲存到資料庫,如MySQL和MongoDB等,也可儲存至遠端伺服器,如藉助SFTP進行操作等。

(4)自動化程式

說到自動化程式,意思是說爬蟲可以代替人來完成這些操作。首先,我們手工當然可以提取這些資訊,但是當量特別大或者想快速獲取大量資料的話,肯定還是要藉助程式。爬蟲就是代替我們來完成這份爬取工作的自動化程式,它可以在抓取過程中進行各種異常處理、錯誤重試等操作,確保爬取持續高效地執行。

2. 能抓怎樣的資料

在網頁中我們能看到各種各樣的資訊,最常見的便是常規網頁,它們對應著HTML程式碼,而最常抓取的便是HTML原始碼。

另外,可能有些網頁返回的不是HTML程式碼,而是一個JSON字串(其中API介面大多采用這樣的形式),這種格式的資料方便傳輸和解析,它們同樣可以抓取,而且資料提取更加方便。

此外,我們還可以看到各種二進位制資料,如圖片、視訊和音訊等。利用爬蟲,我們可以將這些二進位制資料抓取下來,然後儲存成對應的檔名。

另外,還可以看到各種副檔名的檔案,如CSS、JavaScript和配置檔案等,這些其實也是最普通的檔案,只要在瀏覽器裡面可以訪問到,就可以將其抓取下來。

上述內容其實都對應各自的URL,是基於HTTP或HTTPS協議的,只要是這種資料,爬蟲都可以抓取。

3. JavaScript渲染頁面

有時候,我們在用urllib或requests抓取網頁時,得到的原始碼實際和瀏覽器中看到的不一樣。

這是一個非常常見的問題。現在網頁越來越多地採用Ajax、前端模組化工具來構建,整個網頁可能都是由JavaScript渲染出來的,也就是說原始的HTML程式碼就是一個空殼,例如:

1 2 3 4 5 6 7 8 9 10 11 12 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>This is a Demo</title> </head> <body> <div id="container"> </div> </body> <script src="app.js"></script> </html>

body節點裡面只有一個idcontainer的節點,但是需要注意在body節點後引入了app.js,它便負責整個網站的渲染。

在瀏覽器中開啟這個頁面時,首先會載入這個HTML內容,接著瀏覽器會發現其中引入了一個app.js檔案,然後便會接著去請求這個檔案,獲取到該檔案後,便會執行其中的JavaScript程式碼,而JavaScript則會改變HTML中的節點,向其新增內容,最後得到完整的頁面。

但是在用urllib或requests等庫請求當前頁面時,我們得到的只是這個HTML程式碼,它不會幫助我們去繼續載入這個JavaScript檔案,這樣也就看不到瀏覽器中的內容了。

這也解釋了為什麼有時我們得到的原始碼和瀏覽器中看到的不一樣。

因此,使用基本HTTP請求庫得到的原始碼可能跟瀏覽器中的頁面原始碼不太一樣。對於這樣的情況,我們可以分析其後臺Ajax介面,也可使用Selenium、Splash這樣的庫來實現模擬JavaScript渲染。

後面,我們會詳細介紹如何採集JavaScript渲染的網頁。

本節介紹了爬蟲的一些基本原理,這可以幫助我們在後面編寫爬蟲時更加得心應手。