在本節中,咱們會詳細瞭解HTTP的基本原理,瞭解在瀏覽器中敲入URL到獲取網頁內容之間發生了什麼。瞭解了這些內容,有助於咱們進一步瞭解爬蟲的基本原理。javascript
這裏咱們先了解一下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
接下來,咱們再瞭解一個概念——超文本,其英文名稱叫做hypertext,咱們在瀏覽器裏看到的網頁就是超文本解析而成的,其網頁源代碼是一系列HTML代碼,裏面包含了一系列標籤,好比img
顯示圖片,p
指定顯示段落等。瀏覽器解析這些標籤後,便造成了咱們日常看到的網頁,而網頁的源代碼HTML就能夠稱做超文本。小程序
例如,咱們在Chrome瀏覽器裏面打開任意一個頁面,如淘寶首頁,右擊任一地方並選擇「檢查」項(或者直接按快捷鍵F12),便可打開瀏覽器的開發者工具,這時在Elements選項卡便可看到當前網頁的源代碼,這些源代碼都是超文本,如圖2-2所示。微信小程序
圖2-2 源代碼瀏覽器
在淘寶的首頁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加密的,它的主要做用能夠分爲兩種。
如今愈來愈多的網站和App都已經向HTTPS方向發展,例如:
而某些網站雖然使用了HTTPS協議,但仍是會被瀏覽器提示不安全,例如咱們在Chrome瀏覽器裏面打開12306,連接爲:www.12306.cn/,這時瀏覽器就會提示「您的鏈接不是私密鏈接」這樣的話,如圖2-3所示。
圖2-3 12306頁面
這是由於12306的CA證書是中國鐵道部自行簽發的,而這個證書是不被CA機構信任的,因此這裏證書驗證就不會經過而提示這樣的話,可是實際上它的數據傳輸依然是通過SSL加密的。若是要爬取這樣的站點,就須要設置忽略證書的選項,不然會提示SSL連接錯誤。
咱們在瀏覽器中輸入一個URL,回車以後便會在瀏覽器中觀察到頁面內容。實際上,這個過程是瀏覽器向網站所在的服務器發送了一個請求,網站服務器接收到這個請求後進行處理和解析,而後返回對應的響應,接着傳回給瀏覽器。響應裏包含了頁面的源代碼等內容,瀏覽器再對其進行解析,便將網頁呈現了出來,模型如圖2-4所示。
圖2-4 模型圖
此處客戶端即表明咱們本身的PC或手機瀏覽器,服務器即要訪問的網站所在的服務器。
爲了更直觀地地說明這個過程,這裏用Chrome瀏覽器的開發者模式下的Network監聽組件來作下演示,它能夠顯示訪問當前請求網頁時發生的全部網絡請求和響應。
打開Chrome瀏覽器,右擊並選擇「檢查」項,便可打開瀏覽器的開發者工具。這裏訪問百度www.baidu.com/,輸入該URL後回車,觀察這個過程當中發生了怎樣的網絡請求。能夠看到,在Network頁面下方出現了一個個的條目,其中一個條目就表明一次發送請求和接收響應的過程,如圖2-5所示。
圖2-5 Network面板
咱們先觀察第一個網絡請求,即www.baidu.com。
其中各列的含義以下。
點擊這個條目,便可看到更詳細的信息,如圖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就是響應的一部分,例如其中包含了服務器的類型、文檔類型、日期等信息,瀏覽器接受到響應後,會解析響應內容,進而呈現網頁內容。
下面咱們分別來介紹一下請求和響應都包含哪些內容。
請求,由客戶端向服務端發出,能夠分爲4部份內容:請求方法(Request Method)、請求的網址(Request URL)、請求頭(Request Headers)、請求體(Request Body)。
常見的請求方法有兩種:GET和POST。
在瀏覽器中直接輸入URL並回車,這便發起了一個GET請求,請求的參數會直接包含到URL裏。例如,在百度中搜索Python,這就是一個GET請求,連接爲www.baidu.com/s?wd=Python,其中URL中包含了請求的參數信息,這裏參數wd
表示要搜尋的關鍵字。POST請求大多在表單提交時發起。好比,對於一個登陸表單,輸入用戶名和密碼後,點擊「登陸」按鈕,這一般會發起一個POST請求,其數據一般以表單的形式傳輸,而不會體如今URL中。
GET和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…。
請求的網址,即統一資源定位符URL,它能夠惟一肯定咱們想請求的資源。
請求頭,用來講明服務器要使用的附加信息,比較重要的信息有Cookie、Referer、User-Agent等。下面簡要說明一些經常使用的頭信息。
所以,請求頭是請求的重要組成部分,在寫爬蟲時,大部分狀況下都須要設定請求頭。
請求體通常承載的內容是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提交後沒法正常響應。
響應,由服務端返回給客戶端,能夠分爲三部分:響應狀態碼(Response Status Code)、響應頭(Response Headers)和響應體(Response Body)。
響應狀態碼錶示服務器的響應狀態,如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協議版本 |
響應頭包含了服務器對請求的應答信息,如Content-Type、Server、Set-Cookie等。下面簡要說明一些經常使用的頭信息。
最重要的當屬響應體的內容了。響應的正文數據都在響應體中,好比請求網頁時,它的響應體就是網頁的HTML代碼;請求一張圖片時,它的響應體就是圖片的二進制數據。咱們作爬蟲請求網頁後,要解析的內容就是響應體,如圖2-8所示。
圖2-8 響應體內容
在瀏覽器開發者工具中點擊Preview,就能夠看到網頁的源代碼,也就是響應體的內容,它是解析的目標。
在作爬蟲時,咱們主要經過響應體獲得網頁的源代碼、JSON數據等,而後從中作相應內容的提取。
本節中,咱們瞭解了HTTP的基本原理,大概瞭解了訪問網頁時背後的請求和響應過程。本節涉及的知識點須要好好掌握,後面分析網頁請求時會常常用到。
本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)