1. 程式人生 > >小白學 Python 爬蟲(9):爬蟲基礎

小白學 Python 爬蟲(9):爬蟲基礎

人生苦短,我用 Python

前文傳送門:

小白學 Python 爬蟲(1):開篇

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門

小白學 Python 爬蟲(5):前置準備(四)資料庫基礎

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝

小白學 Python 爬蟲(7):HTTP 基礎

小白學 Python 爬蟲(8):網頁基礎

爬蟲的核心

什麼是爬蟲,講點通俗易懂的,爬蟲就是爬取網頁,從中按照一定規則提取資訊,重複以上過程自動化重複完成的程式。

一隻爬蟲,第一件事情就是要爬取網頁,這裡主要是指獲取網頁的原始碼。在網頁的原始碼裡,會含有我們所需要的資訊,而我們要做的事情就是從原始碼中將這些資訊提取出來。

我們請求網頁的時候, Python 為我們提供了很多庫來做這件事情,比如官方提供的 urllib ,以及第三方提供的 requests 、 Aiohttp 等。

我們可以使用這些庫來發送 HTTP 請求,獲取響應的資料,得到響應之後,我們只需要解析其中 body 部分的資料,就可以獲得網頁的原始碼。

獲取到原始碼以後,我們接下來的工作就是解析原始碼,從中提取出我們需要的資料。

提取資料最基礎也是最常用的是使用正則表示式的方式的,但是這種方式比較複雜,也比較容易出錯,不過不得不說,一個正則表示式寫的非常厲害的人,完全用不著下面的這些解析類庫,這是一個萬能的方法。

悄悄的說一句,小編的正則表示式寫的也不好,才會使用到這些由第三方提供的類庫。

用於提取資料的類庫有 Beautiful Soup 、 pyquery 、 lxml 等等。使用這些庫,我們可以高效快速地從 HTML 中提取網頁資訊,如節點的屬性、文字值等。

從原始碼中提取到資料以後,我們會對資料進行儲存,這裡的儲存形式多種多樣,可以直接儲存成 txt 、 json 、 Excel 檔案等等,也可以儲存至資料庫,如 Mysql 、 Oracle 、 SQLServer 、 MongoDB 等等。

抓取的資料格式

一般而言,我們抓取到的都是 HTML 的網頁原始碼,這個是我們看得到的、常規的、直觀的網頁資訊。

但是有些資訊,並不是直接和 HTML 一起返回至網頁的,會存在各種各樣的 API 介面,這種介面返回的資料現在大多數是 JSON 的格式,也有一些會返回 XML 的資料格式,還會有一些個別的奇葩的介面直接返回程式猿自定義的字串。這種 API 資料介面就需要具體問題具體分析了。

還有一些資訊,比如各大圖片站、視訊站(如抖音、 B站),我們想要爬取的資訊是圖片或者視訊,這些資訊是已二進位制的形式存在的,我們需要將這些二進位制的資料爬取下來再進行轉儲。

此外,我們還能抓取到一些資原始檔,如 CSS 、 JavaScript 等指令碼資源,有的還會有一些 woff 等字型資訊。這些資訊是一個網頁組成不可或缺的元素,只要瀏覽器能訪問到的,我們都可以將其爬取下來。

現代前端頁面爬取

今天核心內容來了!!!

很多時候,我們使用 HTTP 請求庫爬取網頁原始碼時,爬取到的資訊和我們在網頁上看到的資訊完全不一樣,只有短短的幾行。

這是因為最近這幾年,前端技術突飛猛進,大量的採用前端模組化工具來構建前端頁面,比較常用的框架有 Vue 、 React 等等。

導致我們獲取到的網頁只有一個空殼子,例如這種:

<!DOCTYPE html>
<html lang="en" style="background-color: #26282A; height: 100%">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>演示專案</title>
  </head>
  <style>
    html,
    body,
    #app {
      height: 100%
    }
  </style>
  <body>
    <noscript>
      <strong>We're sorry but xxxxxx doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <script src=/js/chunk-vendors.84ee7bec.js></script>
    <script src=/js/app.4170317d.js></script>
  </body>
</html>

程式碼來源是博主平時做的一些小東西,其中博主已經省略大量引入的 JavaScript。

body 節點裡面只有一個 id 為 app 的節點,但是需要注意在 body 節點的最後引入了 JavaScript 檔案,它們負責整個網頁的渲染。

在瀏覽器開啟這個頁面後,首先會載入這個 HTML 的內容,接著會發現有 JavaScript 的指令碼檔案載入,獲取到這些指令碼檔案後,開始執行其中的程式碼,而 JavaScript 指令碼檔案則會修改整個頁面的 HTML 程式碼,向其中新增節點,從而完成整個頁面的渲染。

但是當我們使用請求庫去請求這個頁面的時候,只能獲得當前的 HTML 的內容,它並不會去幫我們獲取這個 JavaScript 指令碼檔案並且幫我們執行這個指令碼檔案渲染整個 HTML DOM 節點,我們當然也就看不到瀏覽器當中看到的內容。

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

當然,遇到這種情況也不要慌,我們還可以使用Selenium、Splash這樣的庫來實現模擬瀏覽器中的 JavaScript 渲染。

後面,我們會慢慢聊這些內容,本文主要先幫各位同學對爬蟲有一個基礎的瞭解,方便後續的學習。

參考:

https://cuiqingcai.com/5484.h