天天看點

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

點選檢視第一章 點選檢視第三章

第2章 網絡爬蟲基礎

  網絡爬蟲實作的思想是模拟使用者使用浏覽器向網站發送請求,網站響應請求後,将HTML文檔發送過來,爬蟲再對網頁做資訊提取和存儲。是以,了解浏覽器與網站伺服器之間的通信方式和互動過程,了解HTML頁面的組織和結構,掌握頁面資訊的提取和存儲技術,能進一步加深對網絡爬蟲原理的了解。

2.1 HTTP基本原理

  下面來看一下使用者從浏覽器輸入某個網址到擷取網站内容的整個過程。該過程主要分為4個步驟,如圖2-1所示。

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

圖2-1 通路網站的過程

  (1)在浏覽器中輸入URL位址(如百度位址

https://www.baidu.com

),然後回車。

  (2)在浏覽器中向網站伺服器發送請求通路的指令。

  (3)網站伺服器響應請求後,向浏覽器發送HTML文檔(也可以是圖檔、視訊和JSON資料等其他資源)。

  (4)浏覽器解析、渲染HTML文檔後,将頁面展示給使用者。

  下面詳細講解這些步驟中的關鍵知識,這将有助于我們更深入地了解爬蟲的基本原理。

2.1.1 URL介紹

  我們把在浏覽器的位址欄裡輸入的網址叫做URL(Uniform Resource Locator,統一資源定位符)。URL用于确定分散在網際網路中各種資源的位置和通路方式。例如攝圖網中故宮博物館的圖檔位址為

http://seopic.699pic.com/photo/50088/2824.jpg_wh1200.jpg

。它包含了以下幾種資訊:

  • 通路協定:http,用于确定資料傳輸的方式。
  • 伺服器名稱:seopic.699pic.com,圖檔所在的網站伺服器位址。
  • 通路路徑:photo/50088,圖檔目錄。
  • 資源名:2824.jpg_wh1200.jpg,圖檔名稱。

2.1.2 HTTP和HTTPS協定

  首先來看一下通路協定。為了保證浏覽器能夠正确解析并顯示網站伺服器傳送的資源,需要制定一套雙方都遵守的協定,最常見的有HTTP和HTTPS協定。當然還有其他功能的協定,如FTP(檔案傳輸協定)、TELNET(遠端登入服務)、FILE(本地檔案傳輸協定)等。在爬蟲中,通常是通過HTTP或HTTPS協定擷取到頁面的。

  下面就來了解一下這兩個協定。

  HTTP(HyperText Transfer Protocol,超文本傳輸協定)是用于從網絡中傳輸超文本到本地浏覽器的傳輸協定,是網際網路中應用最廣泛的一種網絡協定。它能保證高效而準确地傳送超文本文檔,我們平常看到的HTML文檔就是超文本文檔。

  HTTP協定以明文方式發送内容,不提供任何方式的資料加密。像銀行卡号、密碼等對安全性要求高的資訊傳輸,就不能使用HTTP,而要使用HTTPS協定。

  HTTPS(HyperText Transfer Protocol over Secure Socket Layer,安全套接字層超文本傳輸協定)是以安全為目标的HTTP通道,簡單地講,就是HTTP的安全版。HTTPS在HTTP的基礎上加入了SSL協定,SSL依靠證書來驗證伺服器的身份,并對浏覽器和伺服器之間的通信加密。

  目前,越來越多的網站都開始采用安全級别更高的HTTPS協定了。

2.1.3 HTTP請求(Request)

  當使用者通過浏覽器通路某個網站時,浏覽器會向網站伺服器發送通路請求,這個請求就叫做HTTP請求。請求包含的内容主要有:

  • 請求方法(Request Method);
  • 請求網址(Request URL);
  • 請求頭(Request Headers);
  • 請求體(Request Body)。

      為了更直覺地說明這個過程,我們使用Chrome浏覽器自帶的“開發者工具”來檢視浏覽器發送的請求資訊。下面以通路百度(

    )為例來講解。

  (1)打開Chrome浏覽器,按F12鍵,顯示“開發者工具”欄。

  (2)在位址欄中輸入百度網址

,然後回車。

  (3)此時“開發者工具”欄抓取到了許多浏覽器請求及伺服器響應資訊。按如圖2-2所示的順序選中各個選項,在第4步的Headers頁籤中,就能檢視到請求資訊了。

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

圖2-2 檢視請求内容

  下面來看一下浏覽器向百度的網站伺服器發送了哪些請求資訊。

  1.請求方法(Request Method)

  HTTP協定定義了許多與伺服器互動的方法,最常用的有GET和POST方法。

  如果浏覽器向伺服器發送一個GET請求,則請求的參數資訊會直接包含在URL中。例如在百度搜尋欄中輸入scrapy,單擊“百度一下”按鈕,就形成了一個GET請求。搜尋結果頁面的URL變為

https://www.baidu.com/s?wd=scrapy

,URL中問号(?)後面的wd=scrapy就是請求的參數,表示要搜尋的關鍵字。

  POST請求主要用于表單的送出。表單中輸入的卡号、密碼等隐私資訊通過POST請求方式送出後,資料不會暴露在URL中,而是儲存于請求體中,避免了資訊的洩露。

  2.請求網址(Request URL)

  另外,還有一個選項Remote Address:180.97.33.107:443,這是百度伺服器的IP位址。也可以使用IP位址來通路百度。

  3.請求頭(Request Headers)

  請求頭的内容在Headers頁籤中的Request Headers目錄下,如圖2-3所示。請求頭中包含了許多有關用戶端環境和請求正文的資訊,比較重要的資訊有Cookie和User-Agent等。

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

圖2-3 Chrome中的請求頭

  下面簡單介紹常用的請求頭資訊。

  • Accept:浏覽器端可以接受的媒體類型。text/html代表浏覽器可以接受伺服器發送的文檔類型為text/html,也就是我們常說的HTML文檔。
  • Accept-Encoding:浏覽器接受的編碼方式。
  • Accept-Language:浏覽器所接受的語言種類。
  • Connection:表示是否需要持久連接配接。keep-alive表示浏覽器與網站伺服器保持連接配接;close表示一個請求結束後,浏覽器和網站伺服器就會斷開,下次請求時需重新連接配接。
  • Cookie:有時也用複數形式Cookies,指網站為了辨識使用者身份、進行會話跟蹤而儲存在使用者本地的資料(通常經過加密),由網站伺服器建立。例如當我們登入後,通路該網站的其他頁面時,發現都是處于登入狀态,這是Cookie在發揮作用。因為浏覽器每次在請求該站點的頁面時,都會在請求頭中加上儲存有使用者名和密碼等資訊的Cookie并将其發送給伺服器,伺服器識别出該使用者後,就将頁面發送給浏覽器。在爬蟲中,有時需要爬取登入後才能通路的頁面,通過對Cookie進行設定,就可以成功通路登入後的頁面了。
  • Host:指定被請求資源的Internet主機和端口号,通常從URL中提取。
  • User-Agent:告訴網站伺服器,用戶端使用的作業系統、浏覽器的名稱和版本、CPU版本,以及浏覽器渲染引擎、浏覽器語言等。在爬蟲中,設定此項可以将爬蟲僞裝成浏覽器。

      4.請求體(Request Body)

  請求體中儲存的内容一般是POST請求發送的表單資料。對于GET請求,請求體為空。

2.1.4 HTTP響應(Response)

  當網站伺服器接收到浏覽器的請求後,會發送響應消息給浏覽器,這個響應就叫做HTTP響應。一個完整的響應消息主要包含:

  • 響應狀态碼(Response Status Code);
  • 響應頭(Response Headers);
  • 響應體(Response Body)。

      1.響應狀态碼(Response Status Code)

  響應狀态碼表示伺服器對請求的響應結果。例如,200代表伺服器響應成功,403代表禁止通路,404代表頁面未找到,408代表請求逾時。浏覽器會根據狀态碼做出相應的處理。在爬蟲中,可以根據狀态碼來判斷伺服器的狀态,如果狀态碼為200,則繼續處理資料,否則直接忽略。表2-1中列舉了常見的狀态碼。

表2-1 常見狀态碼及說明

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎
帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

伺服器不支援請求中所用的HTTP協定版本

  2.響應頭(Response Headers)

  響應頭中包含了伺服器對請求的應答資訊。在Chrome浏覽器的“開發者工具”中,響應頭的内容在Headers頁籤中的Response Headers目錄中,如圖2-4所示。

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

圖2-4 Chrome中的響應頭資訊

  下面簡單介紹一下常用的響應頭資訊。

  • Date:伺服器響應時間。
  • Content-Type:傳回資料的文檔類型,如text/html代表傳回HTML文檔;application/x-javascript代表傳回JavaScript檔案;image/jpeg代表傳回圖檔。
  • Content-Encoding:伺服器支援的傳回内容壓縮編碼類型。
  • Server:伺服器軟體的名稱。
  • Set-Cookie:設定HTTP Cookie。
  • Expires:響應過期的日期和時間。

     3.響應體(Response Body)

  響應體中存放伺服器發送給浏覽器的正文資料。在Chrome浏覽器的“開發者工具”中,與Headers頁籤平行的Response頁籤中存儲的就是響應體資料。比如請求通路百度首頁時,它的響應體就是百度首頁的HTML代碼,如圖2-5所示。

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

圖2-5 伺服器傳回的百度首頁的響應體

  當通路攝圖網中故宮博物館的圖檔(

http://seopic.699pic.com/photo/50088/2824.

jpg_wh1200.jpg)時,它的響應體就是一張圖檔的二進制資料。Response頁籤中無法顯示圖檔資料,在左邊的Preview頁籤中可以預覽,如圖2-6所示。

帶你讀《從零開始學Scrapy網絡爬蟲》之二:網絡爬蟲基礎第2章 網絡爬蟲基礎

圖2-6 伺服器傳回的圖檔預覽

  在爬蟲中,我們從響應體中擷取HTML代碼、JSON資料和網絡圖檔等,然後從中提取相應的内容。

2.2 網 頁 基 礎

  當從網站伺服器擷取了HTML文檔後,就需要從文檔中提取有價值、有意義的資料了。如何從看似紛繁複雜、雜亂無章的HTML文檔中提取想要的資料呢?這就必須要了解HTML的基本組成和結構了。可以将HTML看成一個樹形結構,沿着樹根往下周遊,就能找到任何想要位置的資料了。

2.2.1 HTML文檔

  HTML(HyperText Markup Language,超文本标記語言)用于建立網頁。HTML使用标簽來表示不同的内容,如使用表示圖檔,使用