網(wǎng)絡(luò)爬蟲(chóng)基礎(chǔ)之HTTP基本原理(附相關(guān)HTTPS知識(shí))

前言

本文旨在通過(guò)講解HTTP的原理來(lái)為后續(xù)的網(wǎng)絡(luò)爬蟲(chóng)實(shí)踐打下基礎(chǔ)撞叨,其中HTTP圖文來(lái)源于[1]。

隨著越來(lái)越多的網(wǎng)站向HTTPS發(fā)展再沧,了解HTTPS的相關(guān)知識(shí)也是很有必要的提鸟,所以在本文的最后部分補(bǔ)充了相關(guān)HTTPS知識(shí)。

目錄

[TOC]

URI 和 URL

這里我們先了解一下 URI 和 URL宠进,URI 的全稱為 Uniform Resource Identifier,即統(tǒng)一資源標(biāo)志符藐翎,URL 的全稱為 Universal Resource Locator材蹬,即統(tǒng)一資源定位符实幕。

舉例來(lái)說(shuō),https://github.com/favicon.ico堤器,它是一個(gè) URL昆庇,也是一個(gè) URI。即有這樣的一個(gè)圖標(biāo)資源闸溃,我們用 URL/URI 來(lái)唯一指定了它的訪問(wèn)方式整吆,這其中包括了訪問(wèn)協(xié)議 https、訪問(wèn)路徑(即根目錄)和資源名稱 favicon.ico辉川。通過(guò)這樣一個(gè)鏈接掂为,我們便可以從互聯(lián)網(wǎng)上找到這個(gè)資源,這就是 URL/URI员串。

URL 是 URI 的子集,也就是說(shuō)每個(gè) URL 都是 URI昼扛,但不是每個(gè) URI 都是 URL寸齐。那么,怎樣的 URI 不是 URL 呢抄谐?URI 還包括一個(gè)子類叫作 URN渺鹦,它的全稱為 Universal Resource Name,即統(tǒng)一資源名稱蛹含。URN 只命名資源而不指定如何定位資源毅厚,比如 urn:isbn:0451450523 指定了一本書(shū)的 ISBN,可以唯一標(biāo)識(shí)這本書(shū)浦箱,但是沒(méi)有指定到哪里定位這本書(shū)吸耿,這就是 URN。URL酷窥、URN 和 URI 的關(guān)系可以用圖 1 表示咽安。

圖1. URL、URN蓬推、URI 關(guān)系圖

但是在目前的互聯(lián)網(wǎng)妆棒,URN 的使用非常少,所以幾乎所有的 URI 都是 URL沸伏,所以一般的網(wǎng)頁(yè)鏈接我們可以稱之為 URL糕珊,也可以稱之為 URI,我個(gè)人習(xí)慣稱之為 URL毅糟。

超文本

接下來(lái)红选,我們?cè)倭私庖粋€(gè)概念 —— 超文本,其英文名稱叫作 hypertext留特,我們?cè)跒g覽器里看到的網(wǎng)頁(yè)就是超文本解析而成的纠脾,其網(wǎng)頁(yè)源代碼是一系列 HTML 代碼玛瘸,里面包含了一系列標(biāo)簽,比如img 顯示圖片苟蹈,p 指定顯示段落等糊渊。瀏覽器解析這些標(biāo)簽后,便形成了我們平郴弁眩看到的網(wǎng)頁(yè)渺绒,而網(wǎng)頁(yè)的源代碼 HTML 就可以稱作超文本。

例如菱鸥,我們?cè)?Chrome 瀏覽器里面打開(kāi)任意一個(gè)頁(yè)面宗兼,如淘寶首頁(yè),右擊任一地方并選擇 “檢查” 項(xiàng)(或者直接按快捷鍵 F12)氮采,即可打開(kāi)瀏覽器的開(kāi)發(fā)者工具殷绍,這時(shí)在 Elements 選項(xiàng)卡即可看到當(dāng)前網(wǎng)頁(yè)的源代碼,這些源代碼都是超文本鹊漠,如圖 2 所示主到。

圖2. 源代碼

HTTP 和 HTTPS

在淘寶的首頁(yè) https://www.taobao.com/,中躯概,URL 的開(kāi)頭會(huì)有 http 或 https登钥,這個(gè)就是訪問(wèn)資源需要的協(xié)議類型,有時(shí)我們還會(huì)看到 ftp娶靡、sftp牧牢、smb 開(kāi)頭的 URL,那么這里的 ftp姿锭、sftp塔鳍、smb 都是指的協(xié)議類型。在爬蟲(chóng)中呻此,我們抓取的頁(yè)面通常就是 http 或 https 協(xié)議的献幔,我們?cè)谶@里首先來(lái)了解一下這兩個(gè)協(xié)議的含義。

HTTP 的全稱是 Hyper Text Transfer Protocol趾诗,中文名叫做超文本傳輸協(xié)議蜡感,HTTP 協(xié)議是用于從網(wǎng)絡(luò)傳輸超文本數(shù)據(jù)到本地瀏覽器的傳送協(xié)議,它能保證傳送高效而準(zhǔn)確地傳送超文本文檔恃泪。HTTP 由萬(wàn)維網(wǎng)協(xié)會(huì)(World Wide Web Consortium)和 Internet 工作小組 IETF(Internet Engineering Task Force)共同合作制定的規(guī)范郑兴,目前廣泛使用的是 HTTP 1.1 版本。

HTTPS 的全稱是 Hyper Text Transfer Protocol over Secure Socket Layer贝乎,是以安全為目標(biāo)的 HTTP 通道情连,簡(jiǎn)單講是 HTTP 的安全版,即 HTTP 下加入 SSL 層览效,簡(jiǎn)稱為 HTTPS却舀。

HTTPS 的安全基礎(chǔ)是 SSL虫几,因此通過(guò)它傳輸?shù)膬?nèi)容都是經(jīng)過(guò) SSL 加密的,它的主要作用可以分為兩種:

  • 是建立一個(gè)信息安全通道挽拔,來(lái)保證數(shù)據(jù)傳輸?shù)陌踩?/li>
  • 確認(rèn)網(wǎng)站的真實(shí)性辆脸,凡是使用了 https 的網(wǎng)站,都可以通過(guò)點(diǎn)擊瀏覽器地址欄的鎖頭標(biāo)志來(lái)查看網(wǎng)站認(rèn)證之后的真實(shí)信息螃诅,也可以通過(guò) CA 機(jī)構(gòu)頒發(fā)的安全簽章來(lái)查詢啡氢。

現(xiàn)在越來(lái)越多的網(wǎng)站和 APP 都已經(jīng)向 HTTPS 方向發(fā)展。例如:

  • 蘋(píng)果公司強(qiáng)制所有 iOS App 在 2017 年 1 月 1 日 前全部改為使用 HTTPS 加密术裸,否則 APP 就無(wú)法在應(yīng)用商店上架倘是。
  • 谷歌從 2017 年 1 月推出的 Chrome 56 開(kāi)始,對(duì)未進(jìn)行 HTTPS 加密的網(wǎng)址鏈接亮出風(fēng)險(xiǎn)提示袭艺,即在地址欄的顯著位置提醒用戶 “此網(wǎng)頁(yè)不安全”搀崭。
  • 騰訊微信小程序的官方需求文檔要求后臺(tái)使用 HTTPS 請(qǐng)求進(jìn)行網(wǎng)絡(luò)通信,不滿足條件的域名和協(xié)議無(wú)法請(qǐng)求猾编。

而某些網(wǎng)站雖然使用了 HTTPS 協(xié)議還是會(huì)被瀏覽器提示不安全门坷,例如我們?cè)?Chrome 瀏覽器里面打開(kāi) 12306,鏈接為:https://www.12306.cn/袍镀,這時(shí)瀏覽器就會(huì)提示 “您的連接不是私密連接” 這樣的話,如圖 3 所示:

圖3. 12306 頁(yè)面

這是因?yàn)?12306 的 CA 證書(shū)是中國(guó)鐵道部自行簽發(fā)的冻晤,而這個(gè)證書(shū)是不被 CA 機(jī)構(gòu)信任的苇羡,所以這里證書(shū)驗(yàn)證就不會(huì)通過(guò)而提示這樣的話,但是實(shí)際上它的數(shù)據(jù)傳輸依然是經(jīng)過(guò) SSL 加密的鼻弧。

如果要爬取這樣的站點(diǎn)设江,就需要設(shè)置忽略證書(shū)的選項(xiàng),否則會(huì)提示 SSL 鏈接錯(cuò)誤攘轩。

HTTP 請(qǐng)求過(guò)程

我們?cè)跒g覽器中輸入一個(gè) URL叉存,回車之后便會(huì)在瀏覽器中觀察到頁(yè)面內(nèi)容。實(shí)際上度帮,這個(gè)過(guò)程是瀏覽器向網(wǎng)站所在的服務(wù)器發(fā)送了一個(gè)請(qǐng)求歼捏,網(wǎng)站服務(wù)器接收到這個(gè)請(qǐng)求后進(jìn)行處理和解析,然后返回對(duì)應(yīng)的響應(yīng)笨篷,接著傳回給瀏覽器瞳秽。響應(yīng)里包含了頁(yè)面的源代碼等內(nèi)容,瀏覽器再對(duì)其進(jìn)行解析率翅,便將網(wǎng)頁(yè)呈現(xiàn)了出來(lái)练俐,模型如圖 4 所示。

圖4. 模型圖

此處客戶端即代表我們自己的 PC 或手機(jī)瀏覽器冕臭,服務(wù)器即要訪問(wèn)的網(wǎng)站所在的服務(wù)器腺晾。

為了更直觀地說(shuō)明這個(gè)過(guò)程燕锥,這里用 Chrome 瀏覽器的開(kāi)發(fā)者模式下的 Network 監(jiān)聽(tīng)組件來(lái)做下演示,它可以顯示訪問(wèn)當(dāng)前請(qǐng)求網(wǎng)頁(yè)時(shí)發(fā)生的所有網(wǎng)絡(luò)請(qǐng)求和響應(yīng)悯蝉。

打開(kāi) Chrome 瀏覽器归形,右擊并選擇 “檢查” 項(xiàng),即可打開(kāi)瀏覽器的開(kāi)發(fā)者工具泉粉。這里訪問(wèn)百度 http://www.baidu.com/连霉,輸入該 URL 后回車,觀察這個(gè)過(guò)程中發(fā)生了怎樣的網(wǎng)絡(luò)請(qǐng)求嗡靡《搴常可以看到,在 Network 頁(yè)面下方出現(xiàn)了一個(gè)個(gè)的條目,其中一個(gè)條目就代表一次發(fā)送請(qǐng)求和接收響應(yīng)的過(guò)程粟害,如圖 5 所示千元。

圖5. Network 面板

我們先觀察第一個(gè)網(wǎng)絡(luò)請(qǐng)求,即 www.baidu.com哩至,其中各列的含義如下。

  • 第一列 Name:請(qǐng)求的名稱蜜自,一般會(huì)將 URL 的最后一部分內(nèi)容當(dāng)作名稱菩貌。
  • 第二列 Status:響應(yīng)的狀態(tài)碼,這里顯示為 200重荠,代表響應(yīng)是正常的箭阶。通過(guò)狀態(tài)碼,我們可以判斷發(fā)送了請(qǐng)求之后是否得到了正常的響應(yīng)戈鲁。
  • 第三列 Type:請(qǐng)求的文檔類型仇参。這里為document,代表我們這次請(qǐng)求的是一個(gè) HTML 文檔婆殿,內(nèi)容就是一些 HTML 代碼诈乒。
  • 第四列 Initiator:請(qǐng)求源。用來(lái)標(biāo)記請(qǐng)求是由哪個(gè)對(duì)象或進(jìn)程發(fā)起的婆芦。
  • 第五列 Size:從服務(wù)器下載的文件和請(qǐng)求的資源大小怕磨。如果是從緩存中取得的資源,則該列會(huì)顯示 from cache消约。
  • 第六列 Time:發(fā)起請(qǐng)求到獲取響應(yīng)所用的總時(shí)間癌压。
  • 第七列 Waterfall:網(wǎng)絡(luò)請(qǐng)求的可視化瀑布流。

我們點(diǎn)擊這個(gè)條目即可看到其更詳細(xì)的信息荆陆,如圖 6 所示:

圖6. 詳細(xì)信息

首先是 General 部分滩届,Request URL 為請(qǐng)求的 URL,Request Method 為請(qǐng)求的方法,Status Code 為響應(yīng)狀態(tài)碼帜消,Remote Address 為遠(yuǎn)程服務(wù)器的地址和端口棠枉,Referrer Policy 為 Referrer 判別策略。

再繼續(xù)往下泡挺,可以看到辈讶,有 Response HeadersRequest Headers,這分別代表響應(yīng)頭和請(qǐng)求頭娄猫。請(qǐng)求頭里帶有許多請(qǐng)求信息贱除,例如瀏覽器標(biāo)識(shí)、Cookies媳溺、Host 等信息月幌,這是請(qǐng)求的一部分,服務(wù)器會(huì)根據(jù)請(qǐng)求頭內(nèi)的信息判斷請(qǐng)求是否合法悬蔽,進(jìn)而作出對(duì)應(yīng)的響應(yīng)扯躺。圖中看到的 Response Headers 就是響應(yīng)的一部分,例如其中包含了服務(wù)器的類型蝎困、文檔類型录语、日期等信息,瀏覽器接受到響應(yīng)后禾乘,會(huì)解析響應(yīng)內(nèi)容澎埠,進(jìn)而呈現(xiàn)網(wǎng)頁(yè)內(nèi)容。

下面我們分別來(lái)介紹一下請(qǐng)求和響應(yīng)都包含哪些內(nèi)容始藕。

請(qǐng)求

請(qǐng)求蒲稳,由客戶端向服務(wù)端發(fā)出,可以分為 4 部分內(nèi)容:請(qǐng)求方法(Request Method)鳄虱、請(qǐng)求的網(wǎng)址(Request URL)、請(qǐng)求頭(Request Headers)凭峡、請(qǐng)求體(Request Body)拙已。

請(qǐng)求方法

常見(jiàn)的請(qǐng)求方法有兩種:GETPOST

在瀏覽器中直接輸入 URL 并回車摧冀,這便發(fā)起了一個(gè) GET 請(qǐng)求倍踪,請(qǐng)求的參數(shù)會(huì)直接包含到 URL 里。例如索昂,在百度中搜索 Python建车,這就是一個(gè) GET 請(qǐng)求,鏈接為 https://www.baidu.com/s?wd=Python椒惨,其中 URL 中包含了請(qǐng)求的參數(shù)信息缤至,這里參數(shù) wd 表示要搜尋的關(guān)鍵字。POST 請(qǐng)求大多在表單提交時(shí)發(fā)起康谆。比如领斥,對(duì)于一個(gè)登錄表單嫉到,輸入用戶名和密碼后,點(diǎn)擊 “登錄” 按鈕月洛,這通常會(huì)發(fā)起一個(gè) POST 請(qǐng)求何恶,其數(shù)據(jù)通常以表單的形式傳輸,而不會(huì)體現(xiàn)在 URL 中嚼黔。

GET 和 POST 請(qǐng)求方法有如下區(qū)別细层。

  • GET 請(qǐng)求中的參數(shù)包含在 URL 里面,數(shù)據(jù)可以在 URL 中看到唬涧,而 POST 請(qǐng)求的 URL 不會(huì)包含這些數(shù)據(jù)疫赎,數(shù)據(jù)都是通過(guò)表單形式傳輸?shù)模瑫?huì)包含在請(qǐng)求體中爵卒。
  • GET 請(qǐng)求提交的數(shù)據(jù)最多只有 1024 字節(jié)虚缎,而 POST 方式沒(méi)有限制

一般來(lái)說(shuō)钓株,登錄時(shí)实牡,需要提交用戶名和密碼,其中包含了敏感信息轴合,使用 GET 方式請(qǐng)求的話创坞,密碼就會(huì)暴露在 URL 里面,造成密碼泄露受葛,所以這里最好以 POST 方式發(fā)送题涨。上傳文件時(shí),由于文件內(nèi)容比較大总滩,也會(huì)選用 POST 方式纲堵。

我們平常遇到的絕大部分請(qǐng)求都是 GET 或 POST 請(qǐng)求,另外還有一些請(qǐng)求方法闰渔,如 GET席函、HEAD、POST冈涧、PUT茂附、DELETE、OPTIONS督弓、CONNECT营曼、TRACE 等,我們簡(jiǎn)單將其總結(jié)為表 1愚隧。

表 1. 其他請(qǐng)求方法

方  法 描  述
GET 請(qǐng)求頁(yè)面蒂阱,并返回頁(yè)面內(nèi)容
HEAD 類似于 GET 請(qǐng)求,只不過(guò)返回的響應(yīng)中沒(méi)有具體的內(nèi)容,用于獲取報(bào)頭
POST 大多用于提交表單或上傳文件蒜危,數(shù)據(jù)包含在請(qǐng)求體中
PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定文檔中的內(nèi)容
DELETE 請(qǐng)求服務(wù)器刪除指定的頁(yè)面
CONNECT 把服務(wù)器當(dāng)作跳板虱痕,讓服務(wù)器代替客戶端訪問(wèn)其他網(wǎng)頁(yè)
OPTIONS 允許客戶端查看服務(wù)器的性能
TRACE 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷

本表參考:http://www.runoob.com/http/http-methods.html

請(qǐng)求的網(wǎng)址

請(qǐng)求的網(wǎng)址辐赞,即統(tǒng)一資源定位符 URL部翘,它可以唯一確定我們想請(qǐng)求的資源。

請(qǐng)求頭

請(qǐng)求頭响委,用來(lái)說(shuō)明服務(wù)器要使用的附加信息新思,比較重要的信息有 Cookie、Referer赘风、User-Agent 等夹囚。下面簡(jiǎn)要說(shuō)明一些常用的頭信息。

  • Accept:請(qǐng)求報(bào)頭域邀窃,用于指定客戶端可接受哪些類型的信息荸哟。
  • Accept-Language:指定客戶端可接受的語(yǔ)言類型。
  • Accept-Encoding:指定客戶端可接受的內(nèi)容編碼瞬捕。
  • Host:用于指定請(qǐng)求資源的主機(jī) IP 和端口號(hào)鞍历,其內(nèi)容為請(qǐng)求 URL 的原始服務(wù)器或網(wǎng)關(guān)的位置。從 HTTP 1.1 版本開(kāi)始肪虎,請(qǐng)求必須包含此內(nèi)容劣砍。
  • Cookie:也常用復(fù)數(shù)形式 Cookies,這是網(wǎng)站為了辨別用戶進(jìn)行會(huì)話跟蹤而存儲(chǔ)在用戶本地的數(shù)據(jù)扇救。它的主要功能是維持當(dāng)前訪問(wèn)會(huì)話刑枝。例如,我們輸入用戶名和密碼成功登錄某個(gè)網(wǎng)站后迅腔,服務(wù)器會(huì)用會(huì)話保存登錄狀態(tài)信息装畅,后面我們每次刷新或請(qǐng)求該站點(diǎn)的其他頁(yè)面時(shí),會(huì)發(fā)現(xiàn)都是登錄狀態(tài)沧烈,這就是 Cookies 的功勞掠兄。Cookies 里有信息標(biāo)識(shí)了我們所對(duì)應(yīng)的服務(wù)器的會(huì)話,每次瀏覽器在請(qǐng)求該站點(diǎn)的頁(yè)面時(shí)掺出,都會(huì)在請(qǐng)求頭中加上 Cookies 并將其發(fā)送給服務(wù)器徽千,服務(wù)器通過(guò) Cookies 識(shí)別出是我們自己苫费,并且查出當(dāng)前狀態(tài)是登錄狀態(tài)汤锨,所以返回結(jié)果就是登錄之后才能看到的網(wǎng)頁(yè)內(nèi)容。
  • Referer:此內(nèi)容用來(lái)標(biāo)識(shí)這個(gè)請(qǐng)求是從哪個(gè)頁(yè)面發(fā)過(guò)來(lái)的百框,服務(wù)器可以拿到這一信息并做相應(yīng)的處理闲礼,如做來(lái)源統(tǒng)計(jì)、防盜鏈處理等。
  • User-Agent:簡(jiǎn)稱 UA柬泽,它是一個(gè)特殊的字符串頭慎菲,可以使服務(wù)器識(shí)別客戶使用的操作系統(tǒng)及版本、瀏覽器及版本等信息锨并。在做爬蟲(chóng)時(shí)加上此信息露该,可以偽裝為瀏覽器;如果不加第煮,很可能會(huì)被識(shí)別出為爬蟲(chóng)解幼。
  • Content-Type:也叫互聯(lián)網(wǎng)媒體類型(Internet Media Type)或者 MIME 類型,在 HTTP 協(xié)議消息頭中包警,它用來(lái)表示具體請(qǐng)求中的媒體類型信息撵摆。例如,text/html 代表 HTML 格式害晦,image/gif代表 GIF 圖片特铝,application/json 代表 JSON 類型,更多對(duì)應(yīng)關(guān)系可以查看此對(duì)照表:http://tool.oschina.net/commons壹瘟。

因此鲫剿,請(qǐng)求頭是請(qǐng)求的重要組成部分,在寫(xiě)爬蟲(chóng)時(shí)俐筋,大部分情況下都需要設(shè)定請(qǐng)求頭牵素。

請(qǐng)求體

請(qǐng)求體一般承載的內(nèi)容是 POST 請(qǐng)求中的表單數(shù)據(jù),而對(duì)于 GET 請(qǐng)求澄者,請(qǐng)求體則為空笆呆。

例如,這里我登錄 GitHub 時(shí)捕獲到的請(qǐng)求和響應(yīng)如圖 7 所示粱挡。

圖7. 詳細(xì)信息

登錄之前赠幕,我們填寫(xiě)了用戶名和密碼信息,提交時(shí)這些內(nèi)容就會(huì)以表單數(shù)據(jù)的形式提交給服務(wù)器询筏,此時(shí)需要注意 Request Headers 中指定 Content-Type 為 application/x-www-form-urlencoded榕堰。只有設(shè)置 Content-Type 為 application/x-www-form-urlencoded,才會(huì)以表單數(shù)據(jù)的形式提交嫌套。另外逆屡,我們也可以將 Content-Type 設(shè)置為 application/json 來(lái)提交 JSON 數(shù)據(jù),或者設(shè)置為 multipart/form-data 來(lái)上傳文件踱讨。表 2 列出了 Content-Type 和 POST 提交數(shù)據(jù)方式的關(guān)系魏蔗。

表 2. Content-Type 和 POST 提交數(shù)據(jù)方式的關(guān)系

Content-Type 提交數(shù)據(jù)的方式
application/x-www-form-urlencoded 表單數(shù)據(jù)
multipart/form-data 表單文件上傳
application/json 序列化 JSON 數(shù)據(jù)
text/xml XML 數(shù)據(jù)

在爬蟲(chóng)中,如果要構(gòu)造 POST 請(qǐng)求痹筛,需要使用正確的 Content-Type莺治,并了解各種請(qǐng)求庫(kù)的各個(gè)參數(shù)設(shè)置時(shí)使用的是哪種 Content-Type廓鞠,不然可能會(huì)導(dǎo)致 POST 提交后無(wú)法正常響應(yīng)。

響應(yīng)

響應(yīng)谣旁,由服務(wù)端返回給客戶端床佳,可以分為三部分:響應(yīng)狀態(tài)碼(Response Status Code)、響應(yīng)頭(Response Headers)和響應(yīng)體(Response Body)榄审。

響應(yīng)狀態(tài)碼

響應(yīng)狀態(tài)碼表示服務(wù)器的響應(yīng)狀態(tài)砌们,如 200 代表服務(wù)器正常響應(yīng),404 代表頁(yè)面未找到搁进,500 代表服務(wù)器內(nèi)部發(fā)生錯(cuò)誤怨绣。在爬蟲(chóng)中,我們可以根據(jù)狀態(tài)碼來(lái)判斷服務(wù)器響應(yīng)狀態(tài)拷获,如狀態(tài)碼為 200篮撑,則證明成功返回?cái)?shù)據(jù),再進(jìn)行進(jìn)一步的處理匆瓜,否則直接忽略赢笨。表 3 列出了常見(jiàn)的錯(cuò)誤代碼及錯(cuò)誤原因。

表 3. 常見(jiàn)的錯(cuò)誤代碼及錯(cuò)誤原因

狀態(tài)碼 說(shuō)  明 詳  情
100 繼續(xù) 請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求驮吱。服務(wù)器已收到請(qǐng)求的一部分茧妒,正在等待其余部分
101 切換協(xié)議 請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備切換
200 成功 服務(wù)器已成功處理了請(qǐng)求
201 已創(chuàng)建 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源
202 已接受 服務(wù)器已接受請(qǐng)求左冬,但尚未處理
203 非授權(quán)信息 服務(wù)器已成功處理了請(qǐng)求桐筏,但返回的信息可能來(lái)自另一個(gè)源
204 無(wú)內(nèi)容 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容
205 重置內(nèi)容 服務(wù)器成功處理了請(qǐng)求拇砰,內(nèi)容被重置
206 部分內(nèi)容 服務(wù)器成功處理了部分請(qǐng)求
300 多種選擇 針對(duì)請(qǐng)求梅忌,服務(wù)器可執(zhí)行多種操作
301 永久移動(dòng) 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置,即永久重定向
302 臨時(shí)移動(dòng) 請(qǐng)求的網(wǎng)頁(yè)暫時(shí)跳轉(zhuǎn)到其他頁(yè)面除破,即暫時(shí)重定向
303 查看其他位置 如果原來(lái)的請(qǐng)求是 POST牧氮,重定向目標(biāo)文檔應(yīng)該通過(guò) GET 提取
304 未修改 此次請(qǐng)求返回的網(wǎng)頁(yè)未修改,繼續(xù)使用上次的資源
305 使用代理 請(qǐng)求者應(yīng)該使用代理訪問(wèn)該網(wǎng)頁(yè)
307 臨時(shí)重定向 請(qǐng)求的資源臨時(shí)從其他位置響應(yīng)
400 錯(cuò)誤請(qǐng)求 服務(wù)器無(wú)法解析該請(qǐng)求
401 未授權(quán) 請(qǐng)求沒(méi)有進(jìn)行身份驗(yàn)證或驗(yàn)證未通過(guò)
403 禁止訪問(wèn) 服務(wù)器拒絕此請(qǐng)求
404 未找到 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)
405 方法禁用 服務(wù)器禁用了請(qǐng)求中指定的方法
406 不接受 無(wú)法使用請(qǐng)求的內(nèi)容響應(yīng)請(qǐng)求的網(wǎng)頁(yè)
407 需要代理授權(quán) 請(qǐng)求者需要使用代理授權(quán)
408 請(qǐng)求超時(shí) 服務(wù)器請(qǐng)求超時(shí)
409 沖突 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突
410 已刪除 請(qǐng)求的資源已永久刪除
411 需要有效長(zhǎng)度 服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求
412 未滿足前提條件 服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件
413 請(qǐng)求實(shí)體過(guò)大 請(qǐng)求實(shí)體過(guò)大瑰枫,超出服務(wù)器的處理能力
414 請(qǐng)求 URI 過(guò)長(zhǎng) 請(qǐng)求網(wǎng)址過(guò)長(zhǎng)踱葛,服務(wù)器無(wú)法處理
415 不支持類型 請(qǐng)求格式不被請(qǐng)求頁(yè)面支持
416 請(qǐng)求范圍不符 頁(yè)面無(wú)法提供請(qǐng)求的范圍
417 未滿足期望值 服務(wù)器未滿足期望請(qǐng)求標(biāo)頭字段的要求
500 服務(wù)器內(nèi)部錯(cuò)誤 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求
501 未實(shí)現(xiàn) 服務(wù)器不具備完成請(qǐng)求的功能
502 錯(cuò)誤網(wǎng)關(guān) 服務(wù)器作為網(wǎng)關(guān)或代理光坝,從上游服務(wù)器收到無(wú)效響應(yīng)
503 服務(wù)不可用 服務(wù)器目前無(wú)法使用
504 網(wǎng)關(guān)超時(shí) 服務(wù)器作為網(wǎng)關(guān)或代理尸诽,但是沒(méi)有及時(shí)從上游服務(wù)器收到請(qǐng)求
505 HTTP 版本不支持 服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本

響應(yīng)頭

響應(yīng)頭包含了服務(wù)器對(duì)請(qǐng)求的應(yīng)答信息,如 Content-Type盯另、Server性含、Set-Cookie 等。下面簡(jiǎn)要說(shuō)明一些常用的頭信息土铺。

  • Date:標(biāo)識(shí)響應(yīng)產(chǎn)生的時(shí)間胶滋。
  • Last-Modified:指定資源的最后修改時(shí)間。
  • Content-Encoding:指定響應(yīng)內(nèi)容的編碼悲敷。
  • Server:包含服務(wù)器的信息究恤,比如名稱、版本號(hào)等后德。
  • Content-Type:文檔類型部宿,指定返回的數(shù)據(jù)類型是什么,如 text/html 代表返回 HTML 文檔瓢湃,application/x-javascript 則代表返回 JavaScript 文件理张,image/jpeg 則代表返回圖片。
  • Set-Cookie:設(shè)置 Cookies绵患。響應(yīng)頭中的 Set-Cookie 告訴瀏覽器需要將此內(nèi)容放在 Cookies 中雾叭,下次請(qǐng)求攜帶 Cookies 請(qǐng)求。
  • Expires:指定響應(yīng)的過(guò)期時(shí)間落蝙,可以使代理服務(wù)器或?yàn)g覽器將加載的內(nèi)容更新到緩存中织狐。如果再次訪問(wèn)時(shí),就可以直接從緩存中加載筏勒,降低服務(wù)器負(fù)載移迫,縮短加載時(shí)間。

響應(yīng)體

最重要的當(dāng)屬響應(yīng)體的內(nèi)容了管行。響應(yīng)的正文數(shù)據(jù)都在響應(yīng)體中厨埋,比如請(qǐng)求網(wǎng)頁(yè)時(shí),它的響應(yīng)體就是網(wǎng)頁(yè)的 HTML 代碼捐顷;請(qǐng)求一張圖片時(shí)荡陷,它的響應(yīng)體就是圖片的二進(jìn)制數(shù)據(jù)。我們做爬蟲(chóng)請(qǐng)求網(wǎng)頁(yè)后迅涮,要解析的內(nèi)容就是響應(yīng)體亲善,如圖 8 所示。

圖8. 響應(yīng)體內(nèi)容

在瀏覽器開(kāi)發(fā)者工具中點(diǎn)擊 Preview逗柴,就可以看到網(wǎng)頁(yè)的源代碼蛹头,也就是響應(yīng)體的內(nèi)容,它是解析的目標(biāo)戏溺。

在做爬蟲(chóng)時(shí)渣蜗,我們主要通過(guò)響應(yīng)體得到網(wǎng)頁(yè)的源代碼、JSON 數(shù)據(jù)等旷祸,然后從中做相應(yīng)內(nèi)容的提取耕拷。

我們了解了 HTTP 的基本原理,大概了解了訪問(wèn)網(wǎng)頁(yè)時(shí)背后的請(qǐng)求和響應(yīng)過(guò)程托享。后面分析網(wǎng)頁(yè)請(qǐng)求時(shí)會(huì)經(jīng)常用到這部分知識(shí)骚烧。

HTTPS相關(guān)知識(shí)

概念轉(zhuǎn)換

為方便下面相關(guān)概念理解浸赫,先參考圖9。

圖9. 概念轉(zhuǎn)換

數(shù)字證書(shū)

數(shù)字證書(shū)(digital certificate)是指在互聯(lián)網(wǎng)通訊中標(biāo)志通訊各方身份信息的一個(gè)數(shù)字認(rèn)證赃绊,人們可以在網(wǎng)上用它來(lái)識(shí)別對(duì)方的身份既峡。

數(shù)字證書(shū)包含擁有者的身份信息,頒發(fā)機(jī)構(gòu)的簽名碧查,公鑰和私鑰运敢。身份信息用于證明證書(shū)持有者的身份;頒發(fā)機(jī)構(gòu)的簽名用于保證身份的真實(shí)性忠售;公鑰和私鑰用于通信過(guò)程中加解密传惠,從而保證通訊信息的安全性

CA

CA是 Certificate Authority 的縮寫(xiě)稻扬,也叫“證書(shū)授權(quán)中心”卦方。它是負(fù)責(zé)管理和簽發(fā)證書(shū)的第三方機(jī)構(gòu),作用是檢查證書(shū)持有者身份的合法性泰佳,并簽發(fā)證書(shū)愿汰,以防證書(shū)被偽造或篡改。

所以乐纸,CA實(shí)際上是一個(gè)機(jī)構(gòu)衬廷,負(fù)責(zé)“證件”印制核發(fā)。就像負(fù)責(zé)頒發(fā)身份證的公安局汽绢、負(fù)責(zé)發(fā)放行駛證吗跋、駕駛證的車管所。

CA工作流程

CA是基于非對(duì)稱加密算法來(lái)工作的宁昭,Bob會(huì)先把自己的 public key(和一些其他信息)交給CA跌宛。CA用自己的 private key 加密這些數(shù)據(jù),加密完的數(shù)據(jù)稱為Bob的數(shù)字證書(shū)积仗。

現(xiàn)在Bob要向Alice傳遞 public key疆拘,Bob傳遞的是CA加密之后的數(shù)字證書(shū)。Alice收到以后寂曹,會(huì)通過(guò)CA發(fā)布的CA證書(shū)(包含了CA的public key)哎迄,來(lái)解密Bob的數(shù)字證書(shū),從而獲得Bob的public key隆圆。

此外漱挚,CA把自己的CA證書(shū)集成在了瀏覽器和操作系統(tǒng)里面。Alice拿到瀏覽器或者操作系統(tǒng)的時(shí)候渺氧,已經(jīng)有了CA證書(shū)旨涝,沒(méi)有必要通過(guò)網(wǎng)絡(luò)獲取,這有效避免了中間人劫持的問(wèn)題侣背。

圖10. CA工作流程

SSL協(xié)議

SSL協(xié)議(Secure Sockets Layer 安全套接字協(xié)議)白华,位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間慨默,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層:

SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上弧腥,為高層協(xié)議提供數(shù)據(jù)封裝厦取、壓縮、加密等基本功能的支持鸟赫。

SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開(kāi)始前消别,通訊雙方進(jìn)行身份認(rèn)證抛蚤、協(xié)商加密算法、交換加密密鑰等寻狂。

圖10. 安全機(jī)制

HTTPS請(qǐng)求流程

  • 用戶向web服務(wù)器發(fā)起一個(gè)安全連接的請(qǐng)求岁经;
  • 服務(wù)器返回經(jīng)過(guò)CA認(rèn)證的數(shù)字證書(shū),證書(shū)里面包含了服務(wù)器的 public key 蛇券;
  • 用戶拿到數(shù)字證書(shū)缀壤,用自己瀏覽器內(nèi)置的CA證書(shū)解密得到服務(wù)器的 public key
  • 用戶用服務(wù)器的 public key 加密一個(gè)用于接下來(lái)的對(duì)稱加密算法的密鑰纠亚,傳給web服務(wù)器塘慕;
  • 因?yàn)橹挥蟹?wù)器有 private key 可以解密,所以不用擔(dān)心中間人攔截這個(gè)加密的密鑰蒂胞;
  • 服務(wù)器拿到這個(gè)加密的密鑰图呢,解密獲取密鑰,再使用對(duì)稱加密算法骗随,和用戶完成接下來(lái)的網(wǎng)絡(luò)通信蛤织;

參考資料

[1] Python3網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)實(shí)戰(zhàn)

[2] 淺談SSL/TLS工作原理

[3] 數(shù)字證書(shū)、CA鸿染、CA證書(shū)指蚜,傻傻分不清楚?這一篇看懂涨椒!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摊鸡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蚕冬,更是在濱河造成了極大的恐慌柱宦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件播瞳,死亡現(xiàn)場(chǎng)離奇詭異掸刊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赢乓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)忧侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)石窑,“玉大人,你說(shuō)我怎么就攤上這事蚓炬∷裳罚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵肯夏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我驯击,道長(zhǎng)烁兰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任徊都,我火速辦了婚禮沪斟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暇矫。我一直安慰自己主之,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布李根。 她就那樣靜靜地躺著槽奕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪房轿。 梳的紋絲不亂的頭發(fā)上史翘,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音冀续,去河邊找鬼琼讽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洪唐,可吹牛的內(nèi)容都是我干的钻蹬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凭需,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼问欠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起粒蜈,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顺献,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后枯怖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體注整,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肿轨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寿冕。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖椒袍,靈堂內(nèi)的尸體忽然破棺而出驼唱,到底是詐尸還是另有隱情,我是刑警寧澤驹暑,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布玫恳,位于F島的核電站,受9級(jí)特大地震影響优俘,放射性物質(zhì)發(fā)生泄漏京办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一兼吓、第九天 我趴在偏房一處隱蔽的房頂上張望臂港。 院中可真熱鬧森枪,春花似錦视搏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至式散,卻和暖如春筋遭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暴拄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工漓滔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乖篷。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓响驴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撕蔼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豁鲤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345