第01讲:必知必会,掌握 HTTP 基本原理
1.URI 和 URL
首先,我們來了解一下 URI 和 URL,URI 的全稱為 Uniform Resource Identifier,即統一資源標志符,URL 的全稱為 Universal Resource Locator,即統一資源定位符。
舉例來說,https://github.com/favicon.ico,它是一個 URL,也是一個 URI。即有這樣的一個圖標資源,我們用 URL/URI 來唯一指定了它的訪問方式,這其中包括了訪問協議 HTTPS、訪問路徑(即根目錄)和資源名稱 favicon.ico。通過這樣一個鏈接,我們便可以從互聯網上找到這個資源,這就是 URL/URI。
URL 是 URI 的子集,也就是說每個 URL 都是 URI,但不是每個 URI 都是 URL。那么,什么樣的 URI 不是 URL 呢?URI 還包括一個子類叫作 URN,它的全稱為 Universal Resource Name,即統一資源名稱。
URN 只命名資源而不指定如何定位資源,比如 urn:isbn:0451450523 指定了一本書的 ISBN,可以唯一標識這本書,但是沒有指定到哪里定位這本書,這就是 URN。URL、URN 和 URI 的關系可以用圖表示。
2.超文本
接下來,我們再了解一個概念 —— 超文本,其英文名稱叫作 Hypertext,我們在瀏覽器里看到的網頁就是超文本解析而成的,其網頁源代碼是一系列 HTML 代碼,里面包含了一系列標簽,比如 img 顯示圖片,p 指定顯示段落等。瀏覽器解析這些標簽后,便形成了我們平常看到的網頁,而網頁的源代碼 HTML 就可以稱作超文本。
例如,我們在 Chrome 瀏覽器里面打開任意一個頁面,如淘寶首頁,右擊任一地方并選擇 “檢查” 項(或者直接按快捷鍵 F12),即可打開瀏覽器的開發者工具,這時在 Elements 選項卡即可看到當前網頁的源代碼,這些源代碼都是超文本,如圖所示。
3.HTTP 和 HTTPS
在淘寶的首頁 https://www.taobao.com/中,URL 的開頭會有 http 或 https,這個就是訪問資源需要的協議類型,有時我們還會看到 ftp、sftp、smb 開頭的 URL,那么這里的 ftp、sftp、smb 都是指的協議類型。在爬蟲中,我們抓取的頁面通常就是 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 已經已經是大勢所趨。
4.HTTP 請求過程
我們在瀏覽器中輸入一個 URL,回車之后便可以在瀏覽器中觀察到頁面內容。實際上,這個過程是瀏覽器向網站所在的服務器發送了一個請求,網站服務器接收到這個請求后進行處理和解析,然后返回對應的響應,接著傳回給瀏覽器。響應里包含了頁面的源代碼等內容,瀏覽器再對其進行解析,便將網頁呈現了出來,傳輸模型如圖所示。
此處客戶端即代表我們自己的 PC 或手機瀏覽器,服務器即要訪問的網站所在的服務器。
為了更直觀地說明這個過程,這里用 Chrome 瀏覽器的開發者模式下的 Network 監聽組件來做下演示,它可以顯示訪問當前請求網頁時發生的所有網絡請求和響應。
打開 Chrome 瀏覽器,右擊并選擇 “檢查” 項,即可打開瀏覽器的開發者工具。這里訪問百度 http://www.baidu.com/,輸入該 URL 后回車,觀察這個過程中發生了怎樣的網絡請求。可以看到,在 Network 頁面下方出現了一個個的條目,其中一個條目就代表一次發送請求和接收響應的過程,如圖所示。
我們先觀察第一個網絡請求,即 www.baidu.com,其中各列的含義如下。
- 第一列 Name:請求的名稱,一般會將 URL 的最后一部分內容當作名稱。
- 第二列 Status:響應的狀態碼,這里顯示為 200,代表響應是正常的。通過狀態碼,我們可以判斷發送了請求之后是否得到了正常的響應。
- 第三列 Type:請求的文檔類型。這里為 document,代表我們這次請求的是一個 HTML 文檔,內容就是一些 HTML 代碼。
- 第四列 Initiator:請求源。用來標記請求是由哪個對象或進程發起的。
- 第五列 Size:從服務器下載的文件和請求的資源大小。如果是從緩存中取得的資源,則該列會顯示 from cache。
- 第六列 Time:發起請求到獲取響應所用的總時間。
- 第七列 Waterfall:網絡請求的可視化瀑布流。
我們點擊這個條目即可看到其更詳細的信息,如圖所示。
首先是 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)。
5.1請求方法
常見的請求方法有兩種:GET 和 POST。
在瀏覽器中直接輸入 URL 并回車,這便發起了一個 GET 請求,請求的參數會直接包含到 URL 里。例如,在百度中搜索 Python,這就是一個 GET 請求,鏈接為 https://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 請求,另外還有一些請求方法,如 HEAD、PUT、DELETE、OPTIONS、CONNECT、TRACE 等,我們簡單將其總結為下表。
請求的網址本表參考:http://www.runoob.com/http/http-methods.html。
請求的網址,即統一資源定位符 URL,它可以唯一確定我們想請求的資源。
5.2請求頭
請求頭,用來說明服務器要使用的附加信息,比較重要的信息有 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 類型,更多對應關系可以查看此對照表:http://tool.oschina.net/commons。
因此,請求頭是請求的重要組成部分,在寫爬蟲時,大部分情況下都需要設定請求頭。
5.3請求體
請求體一般承載的內容是 POST 請求中的表單數據,而對于 GET 請求,請求體則為空。
例如,這里我登錄 GitHub 時捕獲到的請求和響應如圖所示。
登錄之前,我們填寫了用戶名和密碼信息,提交時這些內容就會以表單數據的形式提交給服務器,此時需要注意 Request Headers 中指定 Content-Type 為 application/x-www-form-urlencoded。只有設置 Content-Type 為 application/x-www-form-urlencoded,才會以表單數據的形式提交。另外,我們也可以將 Content-Type 設置為 application/json 來提交 JSON 數據,或者設置為 multipart/form-data 來上傳文件。
表格中列出了 Content-Type 和 POST 提交數據方式的關系。
在爬蟲中,如果要構造 POST 請求,需要使用正確的 Content-Type,并了解各種請求庫的各個參數設置時使用的是哪種 Content-Type,不然可能會導致 POST 提交后無法正常響應。
6.響應
響應,由服務端返回給客戶端,可以分為三部分:響應狀態碼(Response Status Code)、響應頭(Response Headers)和響應體(Response Body)。
6.1響應狀態碼
響應狀態碼表示服務器的響應狀態,如 200 代表服務器正常響應,404 代表頁面未找到,500 代表服務器內部發生錯誤。在爬蟲中,我們可以根據狀態碼來判斷服務器響應狀態,如狀態碼為 200,則證明成功返回數據,再進行進一步的處理,否則直接忽略。下表列出了常見的錯誤代碼及錯誤原因。
響應頭包含了服務器對請求的應答信息,如 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:指定響應的過期時間,可以使代理服務器或瀏覽器將加載的內容更新到緩存中。如果再次訪問時,就可以直接從緩存中加載,降低服務器負載,縮短加載時間。
6.2 響應體
最重要的當屬響應體的內容了。響應的正文數據都在響應體中,比如請求網頁時,它的響應體就是網頁的 HTML 代碼;請求一張圖片時,它的響應體就是圖片的二進制數據。我們做爬蟲請求網頁后,要解析的內容就是響應體,如圖所示。
在瀏覽器開發者工具中點擊 Preview,就可以看到網頁的源代碼,也就是響應體的內容,它是解析的目標。
在做爬蟲時,我們主要通過響應體得到網頁的源代碼、JSON 數據等,然后從中做相應內容的提取
總結
以上是生活随笔為你收集整理的第01讲:必知必会,掌握 HTTP 基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第03讲. 原理探究,了解爬虫的基本原理
- 下一篇: 第23讲:利用资源,学会用打码平台处理验