為什麼叫爬蟲:我們可以把網際網路比作一張大網,而爬蟲(即網絡爬蟲)便是在網上爬行的蜘蛛。把網的節點比作一個個網頁,爬蟲爬到這就相當于通路了該頁面,擷取了其資訊。可以把節點間的連線比作網頁與網頁之間的連結關系,這樣蜘蛛通過一個節點後,可以順着節點連線繼續爬行到達下一個節點,即通過一個網頁繼續擷取後續的網頁,這樣整個網的節點便可以被蜘蛛全部爬行到,網站的資料就可以被抓取下來了。
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渲染。
原文連結:https://cuiqingcai.com/5484.html