[Python3網絡爬蟲開發實戰] 2-爬蟲基礎 1-HTTP基本原理

在本節中,咱們會詳細瞭解HTTP的基本原理,瞭解在瀏覽器中敲入URL到獲取網頁內容之間發生了什麼。瞭解了這些內容,有助於咱們進一步瞭解爬蟲的基本原理。javascript

1. URI和URL

這裏咱們先了解一下URI和URL,URI的全稱爲Uniform Resource Identifier,即統一資源標誌符,URL的全稱爲Universal Resource Locator,即統一資源定位符。html

舉例來講,github.com/favicon.ico是GitHub的網站圖標連接,它是一個URL,也是一個URI。即有這樣的一個圖標資源,咱們用URL/URI來惟一指定了它的訪問方式,這其中包括了訪問協議https、訪問路徑(/即根目錄)和資源名稱favicon.ico。經過這樣一個連接,咱們即可以從互聯網上找到這個資源,這就是URL/URI。java

URL是URI的子集,也就是說每一個URL都是URI,但不是每一個URI都是URL。那麼,怎樣的URI不是URL呢?URI還包括一個子類叫做URN,它的全稱爲Universal Resource Name,即統一資源名稱。URN只命名資源而不指定如何定位資源,好比urn:isbn:0451450523指定了一本書的ISBN,能夠惟一標識這本書,可是沒有指定到哪裏定位這本書,這就是URN。URL、URN和URI的關係能夠用圖2-1表示。git

圖2-1 URL、URN和URI關係圖github

可是在目前的互聯網中,URN用得很是少,因此幾乎全部的URI都是URL,通常的網頁連接咱們既能夠稱爲URL,也能夠稱爲URI,我我的習慣稱爲URL。json

2. 超文本

接下來,咱們再瞭解一個概念——超文本,其英文名稱叫做hypertext,咱們在瀏覽器裏看到的網頁就是超文本解析而成的,其網頁源代碼是一系列HTML代碼,裏面包含了一系列標籤,好比img顯示圖片,p指定顯示段落等。瀏覽器解析這些標籤後,便造成了咱們日常看到的網頁,而網頁的源代碼HTML就能夠稱做超文本。小程序

例如,咱們在Chrome瀏覽器裏面打開任意一個頁面,如淘寶首頁,右擊任一地方並選擇「檢查」項(或者直接按快捷鍵F12),便可打開瀏覽器的開發者工具,這時在Elements選項卡便可看到當前網頁的源代碼,這些源代碼都是超文本,如圖2-2所示。微信小程序

圖2-2 源代碼瀏覽器

3. HTTP和HTTPS

在淘寶的首頁www.taobao.com/中,URL的開頭會有http或https,這就是訪問資源須要的協議類型。有時,咱們還會看到ftp、sftp、smb開頭的URL,它們都是協議類型。在爬蟲中,咱們抓取的頁面一般就是http或https協議的,這裏首先了解一下這兩個協議的含義。緩存

HTTP的全稱是Hyper Text Transfer Protocol,中文名叫做超文本傳輸協議。HTTP協議是用於從網絡傳輸超文本數據到本地瀏覽器的傳送協議,它能保證高效而準確地傳送超文本文檔。HTTP由萬維網協會(World Wide Web Consortium)和Internet工做小組IETF(Internet Engineering Task Force)共同合做制定的規範,目前普遍使用的是HTTP 1.1版本。

HTTPS的全稱是Hyper Text Transfer Protocol over Secure Socket Layer,是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,簡稱爲HTTPS。

HTTPS的安全基礎是SSL,所以經過它傳輸的內容都是通過SSL加密的,它的主要做用能夠分爲兩種。

  • 創建一個信息安全通道來保證數據傳輸的安全。
  • 確認網站的真實性,凡是使用了HTTPS的網站,均可以經過點擊瀏覽器地址欄的鎖頭標誌來查看網站認證以後的真實信息,也能夠經過CA機構頒發的安全簽章來查詢。

如今愈來愈多的網站和App都已經向HTTPS方向發展,例如:

  • 蘋果公司強制全部iOS App在2017年1月1日前所有改成使用HTTPS加密,不然App就沒法在應用商店上架;
  • 谷歌從2017年1月推出的Chrome 56開始,對未進行HTTPS加密的網址連接亮出風險提示,即在地址欄的顯著位置提醒用戶「此網頁不安全」;
  • 騰訊微信小程序的官方需求文檔要求後臺使用HTTPS請求進行網絡通訊,不知足條件的域名和協議沒法請求。

而某些網站雖然使用了HTTPS協議,但仍是會被瀏覽器提示不安全,例如咱們在Chrome瀏覽器裏面打開12306,連接爲:www.12306.cn/,這時瀏覽器就會提示「您的鏈接不是私密鏈接」這樣的話,如圖2-3所示。

圖2-3 12306頁面

這是由於12306的CA證書是中國鐵道部自行簽發的,而這個證書是不被CA機構信任的,因此這裏證書驗證就不會經過而提示這樣的話,可是實際上它的數據傳輸依然是通過SSL加密的。若是要爬取這樣的站點,就須要設置忽略證書的選項,不然會提示SSL連接錯誤。

4. HTTP請求過程

咱們在瀏覽器中輸入一個URL,回車以後便會在瀏覽器中觀察到頁面內容。實際上,這個過程是瀏覽器向網站所在的服務器發送了一個請求,網站服務器接收到這個請求後進行處理和解析,而後返回對應的響應,接着傳回給瀏覽器。響應裏包含了頁面的源代碼等內容,瀏覽器再對其進行解析,便將網頁呈現了出來,模型如圖2-4所示。

圖2-4 模型圖

此處客戶端即表明咱們本身的PC或手機瀏覽器,服務器即要訪問的網站所在的服務器。

爲了更直觀地地說明這個過程,這裏用Chrome瀏覽器的開發者模式下的Network監聽組件來作下演示,它能夠顯示訪問當前請求網頁時發生的全部網絡請求和響應。

打開Chrome瀏覽器,右擊並選擇「檢查」項,便可打開瀏覽器的開發者工具。這裏訪問百度www.baidu.com/,輸入該URL後回車,觀察這個過程當中發生了怎樣的網絡請求。能夠看到,在Network頁面下方出現了一個個的條目,其中一個條目就表明一次發送請求和接收響應的過程,如圖2-5所示。

圖2-5 Network面板

咱們先觀察第一個網絡請求,即www.baidu.com。

其中各列的含義以下。

  • 第一列Name:請求的名稱,通常會將URL的最後一部份內容看成名稱。
  • 第二列Status:響應的狀態碼,這裏顯示爲200,表明響應是正常的。經過狀態碼,咱們能夠判斷髮送了請求以後是否獲得了正常的響應。
  • 第三列Type:請求的文檔類型。這裏爲document,表明咱們此次請求的是一個HTML文檔,內容就是一些HTML代碼。
  • 第四列Initiator:請求源。用來標記請求是由哪一個對象或進程發起的。
  • 第五列Size:從服務器下載的文件和請求的資源大小。若是是從緩存中取得的資源,則該列會顯示from cache。
  • 第六列Time:發起請求到獲取響應所用的總時間。
  • 第七列Waterfall:網絡請求的可視化瀑布流。

點擊這個條目,便可看到更詳細的信息,如圖2-6所示。

圖2-6 詳細信息

首先是General部分,Request URL爲請求的URL,Request Method爲請求的方法,Status Code爲響應狀態碼,Remote Address爲遠程服務器的地址和端口,Referrer Policy爲Referrer判別策略。

再繼續往下看,能夠看到,有Response Headers和Request Headers,這分別表明響應頭和請求頭。請求頭裏帶有許多請求信息,例如瀏覽器標識、Cookies、Host等信息,這是請求的一部分,服務器會根據請求頭內的信息判斷請求是否合法,進而做出對應的響應。圖中看到的Response Headers就是響應的一部分,例如其中包含了服務器的類型、文檔類型、日期等信息,瀏覽器接受到響應後,會解析響應內容,進而呈現網頁內容。

下面咱們分別來介紹一下請求和響應都包含哪些內容。

5. 請求

請求,由客戶端向服務端發出,能夠分爲4部份內容:請求方法(Request Method)、請求的網址(Request URL)、請求頭(Request Headers)、請求體(Request Body)。

(1) 請求方法

常見的請求方法有兩種:GET和POST。

在瀏覽器中直接輸入URL並回車,這便發起了一個GET請求,請求的參數會直接包含到URL裏。例如,在百度中搜索Python,這就是一個GET請求,連接爲www.baidu.com/s?wd=Python,其中URL中包含了請求的參數信息,這裏參數wd表示要搜尋的關鍵字。POST請求大多在表單提交時發起。好比,對於一個登陸表單,輸入用戶名和密碼後,點擊「登陸」按鈕,這一般會發起一個POST請求,其數據一般以表單的形式傳輸,而不會體如今URL中。

GET和POST請求方法有以下區別。

  • GET請求中的參數包含在URL裏面,數據能夠在URL中看到,而POST請求的URL不會包含這些數據,數據都是經過表單形式傳輸的,會包含在請求體中。
  • GET請求提交的數據最多隻有1024字節,而POST方式沒有限制。

通常來講,登陸時,須要提交用戶名和密碼,其中包含了敏感信息,使用GET方式請求的話,密碼就會暴露在URL裏面,形成密碼泄露,因此這裏最好以POST方式發送。上傳文件時,因爲文件內容比較大,也會選用POST方式。

咱們日常遇到的絕大部分請求都是GET或POST請求,另外還有一些請求方法,如GET、HEAD、POST、PUT、DELETE、OPTIONS、CONNECT、TRACE等,咱們簡單將其總結爲表2-1。

表2-1 其餘請求方法

方法

描述

GET

請求頁面,並返回頁面內容

HEAD

相似於GET請求,只不過返回的響應中沒有具體的內容,用於獲取報頭

POST

大多用於提交表單或上傳文件,數據包含在請求體中

PUT

從客戶端向服務器傳送的數據取代指定文檔中的內容

DELETE

請求服務器刪除指定的頁面

CONNECT

把服務器看成跳板,讓服務器代替客戶端訪問其餘網頁

OPTIONS

容許客戶端查看服務器的性能

TRACE

回顯服務器收到的請求,主要用於測試或診斷

本表參考:www.runoob.com/http/http-m…

(2) 請求的網址

請求的網址,即統一資源定位符URL,它能夠惟一肯定咱們想請求的資源。

(3) 請求頭

請求頭,用來講明服務器要使用的附加信息,比較重要的信息有Cookie、Referer、User-Agent等。下面簡要說明一些經常使用的頭信息。

  • Accept:請求報頭域,用於指定客戶端可接受哪些類型的信息。
  • Accept-Language:指定客戶端可接受的語言類型。
  • Accept-Encoding:指定客戶端可接受的內容編碼。
  • Host:用於指定請求資源的主機IP和端口號,其內容爲請求URL的原始服務器或網關的位置。從HTTP 1.1版本開始,請求必須包含此內容。
  • Cookie:也經常使用複數形式 Cookies,這是網站爲了辨別用戶進行會話跟蹤而存儲在用戶本地的數據。它的主要功能是維持當前訪問會話。例如,咱們輸入用戶名和密碼成功登陸某個網站後,服務器會用會話保存登陸狀態信息,後面咱們每次刷新或請求該站點的其餘頁面時,會發現都是登陸狀態,這就是Cookies的功勞。Cookies裏有信息標識了咱們所對應的服務器的會話,每次瀏覽器在請求該站點的頁面時,都會在請求頭中加上Cookies並將其發送給服務器,服務器經過Cookies識別出是咱們本身,而且查出當前狀態是登陸狀態,因此返回結果就是登陸以後才能看到的網頁內容。
  • Referer:此內容用來標識這個請求是從哪一個頁面發過來的,服務器能夠拿到這一信息並作相應的處理,如做來源統計、防盜鏈處理等。
  • User-Agent:簡稱UA,它是一個特殊的字符串頭,可使服務器識別客戶使用的操做系統及版本、瀏覽器及版本等信息。在作爬蟲時加上此信息,能夠假裝爲瀏覽器;若是不加,極可能會被識別出爲爬蟲。
  • Content-Type:也叫互聯網媒體類型(Internet Media Type)或者MIME類型,在HTTP協議消息頭中,它用來表示具體請求中的媒體類型信息。例如,text/html表明HTML格式,image/gif表明GIF圖片,application/json表明JSON類型,更多對應關係能夠查看此對照表:tool.oschina.net/commons

所以,請求頭是請求的重要組成部分,在寫爬蟲時,大部分狀況下都須要設定請求頭。

(4) 請求體

請求體通常承載的內容是POST請求中的表單數據,而對於GET請求,請求體則爲空。

例如,這裏我登陸GitHub時捕獲到的請求和響應如圖2-7所示。

圖2-7 詳細信息

登陸以前,咱們填寫了用戶名和密碼信息,提交時這些內容就會以表單數據的形式提交給服務器,此時須要注意Request Headers中指定Content-Type爲application/x-www-form-urlencoded。只有設置Content-Type爲application/x-www-form-urlencoded,纔會以表單數據的形式提交。另外,咱們也能夠將Content-Type設置爲application/json來提交JSON數據,或者設置爲multipart/form-data來上傳文件。

表2-2列出了Content-Type和POST提交數據方式的關係。

表2-2 Content-Type和POST提交數據方式的關係

Content-Type

提交數據的方式

application/x-www-form-urlencoded

表單數據

multipart/form-data

表單文件上傳

application/json

序列化JSON數據

text/xml

XML數據

在爬蟲中,若是要構造POST請求,須要使用正確的Content-Type,並瞭解各類請求庫的各個參數設置時使用的是哪一種Content-Type,否則可能會致使POST提交後沒法正常響應。

6. 響應

響應,由服務端返回給客戶端,能夠分爲三部分:響應狀態碼(Response Status Code)、響應頭(Response Headers)和響應體(Response Body)。

(1) 響應狀態碼

響應狀態碼錶示服務器的響應狀態,如200表明服務器正常響應,404表明頁面未找到,500表明服務器內部發生錯誤。在爬蟲中,咱們能夠根據狀態碼來判斷服務器響應狀態,如狀態碼爲200,則證實成功返回數據,再進行進一步的處理,不然直接忽略。表2-3列出了常見的錯誤代碼及錯誤緣由。

表2-3 常見的錯誤代碼及錯誤緣由

狀態碼

說明

詳情

100

繼續

請求者應當繼續提出請求。服務器已收到請求的一部分,正在等待其他部分

101

切換協議

請求者已要求服務器切換協議,服務器已確認並準備切換

200

成功

服務器已成功處理了請求

201

已建立

請求成功而且服務器建立了新的資源

202

已接受

服務器已接受請求,但還沒有處理

203

非受權信息

服務器已成功處理了請求,但返回的信息可能來自另外一個源

204

無內容

服務器成功處理了請求,但沒有返回任何內容

205

重置內容

服務器成功處理了請求,內容被重置

206

部份內容

服務器成功處理了部分請求

300

多種選擇

針對請求,服務器可執行多種操做

301

永久移動

請求的網頁已永久移動到新位置,即永久重定向

302

臨時移動

請求的網頁暫時跳轉到其餘頁面,即暫時重定向

303

查看其餘位置

若是原來的請求是POST,重定向目標文檔應該經過GET提取

304

未修改

這次請求返回的網頁未修改,繼續使用上次的資源

305

使用代理

請求者應該使用代理訪問該網頁

307

臨時重定向

請求的資源臨時從其餘位置響應

400

錯誤請求

服務器沒法解析該請求

401

未受權

請求沒有進行身份驗證或驗證未經過

403

禁止訪問

服務器拒絕此請求

404

未找到

服務器找不到請求的網頁

405

方法禁用

服務器禁用了請求中指定的方法

406

不接受

沒法使用請求的內容響應請求的網頁

407

須要代理受權

請求者須要使用代理受權

408

請求超時

服務器請求超時

409

衝突

服務器在完成請求時發生衝突

410

已刪除

請求的資源已永久刪除

411

須要有效長度

服務器不接受不含有效內容長度標頭字段的請求

412

未知足前提條件

服務器未知足請求者在請求中設置的其中一個前提條件

413

請求實體過大

請求實體過大,超出服務器的處理能力

414

請求URI過長

請求網址過長,服務器沒法處理

415

不支持類型

請求格式不被請求頁面支持

416

請求範圍不符

頁面沒法提供請求的範圍

417

未知足指望值

服務器未知足指望請求標頭字段的要求

500

服務器內部錯誤

服務器遇到錯誤,沒法完成請求

501

未實現

服務器不具有完成請求的功能

502

錯誤網關

服務器做爲網關或代理,從上游服務器收到無效響應

503

服務不可用

服務器目前沒法使用

504

網關超時

服務器做爲網關或代理,可是沒有及時從上游服務器收到請求

505

HTTP版本不支持

服務器不支持請求中所用的HTTP協議版本

(2) 響應頭

響應頭包含了服務器對請求的應答信息,如Content-Type、Server、Set-Cookie等。下面簡要說明一些經常使用的頭信息。

  • Date:標識響應產生的時間。
  • Last-Modified:指定資源的最後修改時間。
  • Content-Encoding:指定響應內容的編碼。
  • Server:包含服務器的信息,好比名稱、版本號等。
  • Content-Type:文檔類型,指定返回的數據類型是什麼,如text/html表明返回HTML文檔,application/x-javascript則表明返回JavaScript文件,image/jpeg則表明返回圖片。
  • Set-Cookie:設置Cookies。響應頭中的Set-Cookie告訴瀏覽器須要將此內容放在Cookies中,下次請求攜帶Cookies請求。
  • Expires:指定響應的過時時間,可使代理服務器或瀏覽器將加載的內容更新到緩存中。若是再次訪問時,就能夠直接從緩存中加載,下降服務器負載,縮短加載時間。

(3) 響應體

最重要的當屬響應體的內容了。響應的正文數據都在響應體中,好比請求網頁時,它的響應體就是網頁的HTML代碼;請求一張圖片時,它的響應體就是圖片的二進制數據。咱們作爬蟲請求網頁後,要解析的內容就是響應體,如圖2-8所示。

圖2-8 響應體內容

在瀏覽器開發者工具中點擊Preview,就能夠看到網頁的源代碼,也就是響應體的內容,它是解析的目標。

在作爬蟲時,咱們主要經過響應體獲得網頁的源代碼、JSON數據等,而後從中作相應內容的提取。

本節中,咱們瞭解了HTTP的基本原理,大概瞭解了訪問網頁時背後的請求和響應過程。本節涉及的知識點須要好好掌握,後面分析網頁請求時會常常用到。


本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓

如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder

weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)

相關文章
相關標籤/搜索