芝麻HTTP:爬蟲的基本原理

咱們能夠把互聯網比做一張大網,而爬蟲(即網絡爬蟲)即是在網上爬行的蜘蛛。把網的節點比做一個個網頁,爬蟲爬到這就至關於訪問了該頁面,獲取了其信息。能夠把節點間的連線比做網頁與網頁之間的連接關係,這樣蜘蛛經過一個節點後,能夠順着節點連線繼續爬行到達下一個節點,即經過一個網頁繼續獲取後續的網頁,這樣整個網的節點即可以被蜘蛛所有爬行到,網站的數據就能夠被抓取下來了。html

1. 爬蟲概述

簡單來講,爬蟲就是獲取網頁並提取和保存信息的自動化程序,下面概要介紹一下。前端

(1) 獲取網頁

爬蟲首先要作的工做就是獲取網頁,這裏就是獲取網頁的源代碼。源代碼裏包含了網頁的部分有用信息,因此只要把源代碼獲取下來,就能夠從中提取想要的信息了。正則表達式

前面講了請求和響應的概念,向網站的服務器發送一個請求,返回的響應體即是網頁源代碼。因此,最關鍵的部分就是構造一個請求併發送給服務器,而後接收到響應並將其解析出來,那麼這個流程怎樣實現呢?總不能手工去截取網頁源碼吧?數據庫

不用擔憂,Python提供了許多庫來幫助咱們實現這個操做,如urllib、requests等。咱們能夠用這些庫來幫助咱們實現HTTP請求操做,請求和響應均可以用類庫提供的數據結構來表示,獲得響應以後只須要解析數據結構中的Body部分便可,即獲得網頁的源代碼,這樣咱們能夠用程序來實現獲取網頁的過程了。瀏覽器

(2) 提取信息

獲取網頁源代碼後,接下來就是分析網頁源代碼,從中提取咱們想要的數據。首先,最通用的方法即是採用正則表達式提取,這是一個萬能的方法,可是在構造正則表達式時比較複雜且容易出錯。服務器

另外,因爲網頁的結構有必定的規則,因此還有一些根據網頁節點屬性、CSS選擇器或XPath來提取網頁信息的庫,如Beautiful Soup、pyquery、lxml等。使用這些庫,咱們能夠高效快速地從中提取網頁信息,如節點的屬性、文本值等。網絡

提取信息是爬蟲很是重要的部分,它可使雜亂的數據變得條理清晰,以便咱們後續處理和分析數據。數據結構

(3) 保存數據

提取信息後,咱們通常會將提取到的數據保存到某處以便後續使用。這裏保存形式有多種多樣,如能夠簡單保存爲TXT文本或JSON文本,也能夠保存到數據庫,如MySQL和MongoDB等,也可保存至遠程服務器,如藉助SFTP進行操做等。併發

(4) 自動化程序

說到自動化程序,意思是說爬蟲能夠代替人來完成這些操做。首先,咱們手工固然能夠提取這些信息,可是當量特別大或者想快速獲取大量數據的話,確定仍是要藉助程序。爬蟲就是代替咱們來完成這份爬取工做的自動化程序,它能夠在抓取過程當中進行各類異常處理、錯誤重試等操做,確保爬取持續高效地運行。app

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節點裏面只有一個idcontainer的節點,可是須要注意在body節點後引入了app.js,它便負責整個網站的渲染。

在瀏覽器中打開這個頁面時,首先會加載這個HTML內容,接着瀏覽器會發現其中引入了一個app.js文件,而後便會接着去請求這個文件,獲取到該文件後,便會執行其中的JavaScript代碼,而JavaScript則會改變HTML中的節點,向其添加內容,最後獲得完整的頁面。

可是在用urllib或requests等庫請求當前頁面時,咱們獲得的只是這個HTML代碼,它不會幫助咱們去繼續加載這個JavaScript文件,這樣也就看不到瀏覽器中的內容了。

這也解釋了爲何有時咱們獲得的源代碼和瀏覽器中看到的不同。

所以,使用基本HTTP請求庫獲得的源代碼可能跟瀏覽器中的頁面源代碼不太同樣。對於這樣的狀況,咱們能夠分析其後臺Ajax接口,也可以使用Selenium、Splash這樣的庫來實現模擬JavaScript渲染。

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

本節介紹了爬蟲的一些基本原理,這能夠幫助咱們在後面編寫爬蟲時更加駕輕就熟。

相關文章
相關標籤/搜索