【Python3網路爬蟲開發實戰】2.3-爬蟲的基本原理
我們可以把互聯網比作一張大網,而爬蟲(即網路爬蟲)便是在網上爬行的蜘蛛。把網的節點比作一個個網頁,爬蟲爬到這就相當於訪問了該頁面,獲取了其信息。可以把節點間的連線比作網頁與網頁之間的鏈接關係,這樣蜘蛛通過一個節點後,可以順著節點連線繼續爬行到達下一個節點,即通過一個網頁繼續獲取後續的網頁,這樣整個網的節點便可以被蜘蛛全部爬行到,網站的數據就可以被抓取下來了。
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代碼就是一個空殼,例如:
<!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
節點裡面只有一個id
為container
的節點,但是需要注意在body
節點後引入了app.js,它便負責整個網站的渲染。
在瀏覽器中打開這個頁面時,首先會載入這個HTML內容,接著瀏覽器會發現其中引入了一個app.js文件,然後便會接著去請求這個文件,獲取到該文件後,便會執行其中的JavaScript代碼,而JavaScript則會改變HTML中的節點,向其添加內容,最後得到完整的頁面。
但是在用urllib或requests等庫請求當前頁面時,我們得到的只是這個HTML代碼,它不會幫助我們去繼續載入這個JavaScript文件,這樣也就看不到瀏覽器中的內容了。
這也解釋了為什麼有時我們得到的源代碼和瀏覽器中看到的不一樣。
因此,使用基本HTTP請求庫得到的源代碼可能跟瀏覽器中的頁面源代碼不太一樣。對於這樣的情況,我們可以分析其後台Ajax介面,也可使用Selenium、Splash這樣的庫來實現模擬JavaScript渲染。
後面,我們會詳細介紹如何採集JavaScript渲染的網頁。
本節介紹了爬蟲的一些基本原理,這可以幫助我們在後面編寫爬蟲時更加得心應手。
本資源首發於崔慶才的個人博客靜覓: Python3網路爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注我的個人微信公眾號:進擊的Coder
http://weixin.qq.com/r/5zsjOyvEZXYarW9Y9271 (二維碼自動識別)
推薦閱讀: