- 實(shí)戰(zhàn)Python網(wǎng)絡(luò)爬蟲(chóng)
- 黃永祥
- 9字
- 2019-11-22 18:44:32
第2章
爬蟲(chóng)開(kāi)發(fā)基礎(chǔ)
2.1 HTTP與HTTPS
HTTP(Hyper Text Transfer Protocol,超文本傳輸協(xié)議)是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)。客戶端是終端用戶,服務(wù)器端是網(wǎng)站。通過(guò)使用Web瀏覽器、網(wǎng)絡(luò)爬蟲(chóng)或者其他工具,客戶端發(fā)起一個(gè)到服務(wù)器上指定端口(默認(rèn)端口為80)的HTTP請(qǐng)求,這個(gè)客戶端叫用戶代理(User Agent)。響應(yīng)的服務(wù)器上存儲(chǔ)著資源,比如HTML文件和圖像,這個(gè)服務(wù)器為源服務(wù)器(Origin Server),在用戶代理和服務(wù)器中間可能存在多個(gè)中間層,比如代理、網(wǎng)關(guān)或者隧道(Tunnels)。
通常,由HTTP客戶端發(fā)起一個(gè)請(qǐng)求,建立一個(gè)到服務(wù)器指定端口(默認(rèn)是80端口)的TCP連接,HTTP服務(wù)器則在那個(gè)端口監(jiān)聽(tīng)客戶端發(fā)送過(guò)來(lái)的請(qǐng)求,一旦收到請(qǐng)求,服務(wù)器(向客戶端)發(fā)回一個(gè)狀態(tài)行(比如"HTTP/1.1 200 OK")和(響應(yīng)的)消息,消息的消息體可能是請(qǐng)求的文件、錯(cuò)誤消息或者其他一些信息。
在瀏覽器的地址欄輸入的網(wǎng)站地址叫作URL(Uniform Resource Locator,統(tǒng)一資源定位符)。就像每家每戶都有一個(gè)門牌地址一樣,每個(gè)網(wǎng)頁(yè)也都有一個(gè)Internet地址。在瀏覽器的地址框中輸入一個(gè)URL或單擊一個(gè)超級(jí)URL時(shí),URL就確定了要瀏覽的地址,向服務(wù)器發(fā)送一次請(qǐng)求,瀏覽器通過(guò)超文本傳輸協(xié)議(HTTP)傳送到服務(wù)器,服務(wù)器根據(jù)請(qǐng)求頭做出相應(yīng)的響應(yīng),將響應(yīng)數(shù)據(jù)返回到客戶端,客戶端收到響應(yīng)內(nèi)容后,通過(guò)瀏覽器翻譯成網(wǎng)頁(yè)。
HTTP協(xié)議傳輸?shù)臄?shù)據(jù)都是未加密的,也就是明文的數(shù)據(jù),因此使用HTTP協(xié)議傳輸隱私信息非常不安全。為了保證這些隱私數(shù)據(jù)能加密傳輸,于是網(wǎng)景公司設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對(duì)HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而誕生了HTTPS。
HTTPS(Hyper Text Transfer Protocol orer Secure Sokcket Layer,可以理解為HTTP+SSL/TLS)在傳輸數(shù)據(jù)之前需要客戶端(瀏覽器)與服務(wù)端(網(wǎng)站)之間進(jìn)行一次握手,在握手過(guò)程中將確立雙方加密傳輸數(shù)據(jù)的密碼信息。HTTP與HTTPS的主要區(qū)別可參考圖2-1所示。

圖2-1 HTTP與HTTPS的區(qū)別
HTTPS的SSL中使用了非對(duì)稱加密、對(duì)稱加密以及HASH算法。握手過(guò)程的簡(jiǎn)單描述如下:
(1)瀏覽器將自己支持的一套加密規(guī)則發(fā)送給網(wǎng)站。
(2)網(wǎng)站從中選出一組加密算法與HASH算法,并將自己的身份信息以證書(shū)的形式發(fā)回給瀏覽器。證書(shū)里面包含網(wǎng)站地址、加密公鑰以及證書(shū)的頒發(fā)機(jī)構(gòu)等信息。
(3)獲得網(wǎng)站證書(shū)之后瀏覽器要做以下工作:
①驗(yàn)證證書(shū)的合法性(如頒發(fā)證書(shū)的機(jī)構(gòu)是否合法、證書(shū)中包含的網(wǎng)站地址是否與正在訪問(wèn)的地址一致等),如果證書(shū)受信任,瀏覽器欄就會(huì)顯示一個(gè)小鎖頭,否則會(huì)給出證書(shū)不受信任的提示。
②如果證書(shū)受信任或者用戶接受了不受信任的證書(shū),瀏覽器就會(huì)生成一串隨機(jī)數(shù)的密碼,并用證書(shū)中提供的公鑰加密。
③使用約定好的HASH計(jì)算握手消息,并使用生成的隨機(jī)數(shù)對(duì)消息進(jìn)行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。
(4)網(wǎng)站接收瀏覽器發(fā)來(lái)的數(shù)據(jù)之后要做以下操作:
①使用自己的私鑰將信息解密并取出密碼,使用密碼解密瀏覽器發(fā)來(lái)的握手消息,并驗(yàn)證HASH是否與瀏覽器發(fā)來(lái)的一致。
②使用密碼加密一段握手消息,發(fā)送給瀏覽器。
(5)如果瀏覽器解密并計(jì)算握手消息的HASH與服務(wù)端發(fā)來(lái)的HASH一致,此時(shí)握手過(guò)程結(jié)束,之后所有的通信數(shù)據(jù)將使用之前瀏覽器生成的隨機(jī)密碼,并利用對(duì)稱加密算法進(jìn)行加密。
瀏覽器與網(wǎng)站互相發(fā)送加密的握手消息并驗(yàn)證,目的是保證雙方都獲得一致的密碼,并且可以正常地加密、解密數(shù)據(jù),為真正數(shù)據(jù)的傳輸做一次測(cè)試。另外,HTTPS一般使用的加密與HASH算法如下。
(1)非對(duì)稱加密算法:RSA、DSA/DSS。
(2)對(duì)稱加密算法:AES、RC4、3DES。
(3)HASH算法:MD5、SHA1、SHA256。
其中,非對(duì)稱加密算法用于在握手過(guò)程中加密生成的密碼,對(duì)稱加密算法用于對(duì)真正傳輸?shù)臄?shù)據(jù)進(jìn)行加密,而HASH算法用于驗(yàn)證數(shù)據(jù)的完整性。由于瀏覽器生成的密碼是整個(gè)數(shù)據(jù)加密的關(guān)鍵,因此在傳輸?shù)臅r(shí)候使用非對(duì)稱加密算法對(duì)其加密。非對(duì)稱加密算法會(huì)生成公鑰和私鑰,公鑰只能用于加密數(shù)據(jù),可以隨意傳輸,而網(wǎng)站的私鑰用于對(duì)數(shù)據(jù)進(jìn)行解密,所以網(wǎng)站都會(huì)非常小心地保管自己的私鑰,防止泄漏。
SSL握手過(guò)程中有任何錯(cuò)誤都會(huì)使加密連接斷開(kāi),從而阻止隱私信息的傳輸,正是由于HTTPS非常安全,攻擊者無(wú)法從中找到下手的地方,因此更多地采用假證書(shū)的手法來(lái)欺騙客戶端,從而獲取明文的信息。
- C++程序設(shè)計(jì)教程
- Java面向?qū)ο筌浖_(kāi)發(fā)
- 單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例:基于STC8051+Proteus仿真與實(shí)戰(zhàn)
- Python零基礎(chǔ)快樂(lè)學(xué)習(xí)之旅(K12實(shí)戰(zhàn)訓(xùn)練)
- Scratch 3.0少兒編程與邏輯思維訓(xùn)練
- 差分進(jìn)化算法及其高維多目標(biāo)優(yōu)化應(yīng)用
- Learning Selenium Testing Tools(Third Edition)
- ADI DSP應(yīng)用技術(shù)集錦
- 手把手教你學(xué)C語(yǔ)言
- Windows Phone 7.5:Building Location-aware Applications
- Getting Started with Nano Server
- Python函數(shù)式編程(第2版)
- Mastering OAuth 2.0
- 零基礎(chǔ)學(xué)Java第2版
- Joomla!Search Engine Optimization