天天看點

爬蟲基礎之基本原理1. 爬蟲概述

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

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