專欄:python網(wǎng)絡(luò)爬蟲從基礎(chǔ)到實(shí)戰(zhàn) 歡迎訂閱!近期還會(huì)不斷更新~
另外:如果想要看更多的計(jì)算機(jī)網(wǎng)絡(luò)知識(shí),可以關(guān)注我的專欄:計(jì)算機(jī)網(wǎng)絡(luò)
往期推薦:
【Python爬蟲開發(fā)基礎(chǔ)①】Python基礎(chǔ)(變量及其命名規(guī)范)
【Python爬蟲開發(fā)基礎(chǔ)②】Python基礎(chǔ)(正則表達(dá)式)
【Python爬蟲開發(fā)基礎(chǔ)③】Python基礎(chǔ)(文件操作方法匯總)
【Python爬蟲開發(fā)基礎(chǔ)④】爬蟲原理
【Python爬蟲開發(fā)基礎(chǔ)⑤】HTML頁面構(gòu)成概述
上一篇文章已經(jīng)介紹了HTML語言,本篇文章來簡(jiǎn)單的介紹一下計(jì)算機(jī)網(wǎng)絡(luò)的應(yīng)用層,特別是Web和HTTP協(xié)議,方便寫程序時(shí),讓我們更加高效的書寫代碼~
1 前置知識(shí)
1.1 網(wǎng)絡(luò)應(yīng)用模型
網(wǎng)絡(luò)應(yīng)用模型是指在網(wǎng)絡(luò)環(huán)境下,進(jìn)行應(yīng)用程序開發(fā)和交互的一種架構(gòu)或模式。常見的網(wǎng)絡(luò)應(yīng)用模型包括客戶端-服務(wù)器模型、瀏覽器-服務(wù)器模型和分布式模型。
1.1.1 C/S架構(gòu)(客戶端-服務(wù)器模型)
在客戶端-服務(wù)器模型中,應(yīng)用程序被分為兩個(gè)主要組件:客戶端和服務(wù)器。
- 客戶端是指用戶使用的設(shè)備(例如個(gè)人計(jì)算機(jī)、手機(jī)應(yīng)用程序或網(wǎng)頁瀏覽器等),客戶端通常提供用戶界面,允許用戶與服務(wù)器進(jìn)行交互,并將用戶的請(qǐng)求打包成數(shù)據(jù)包發(fā)送給服務(wù)器。
- 服務(wù)器是存儲(chǔ)和處理數(shù)據(jù)的遠(yuǎn)程計(jì)算機(jī)(在網(wǎng)絡(luò)中具有固定的 IP 地址和提供特定服務(wù)的軟件,如網(wǎng)站服務(wù)器、文件服務(wù)器、郵件服務(wù)器等),它接收來自客戶端的請(qǐng)求,并根據(jù)請(qǐng)求執(zhí)行相應(yīng)的操作,然后將結(jié)果返回給客戶端。
- 這種模型常用于 Web 應(yīng)用開發(fā)、移動(dòng)應(yīng)用開發(fā)等。
- 客戶端和服務(wù)器之間通過網(wǎng)絡(luò)進(jìn)行通信,通常使用標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議,如HTTP(超文本傳輸協(xié)議)或TCP/IP(傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)??蛻舳送ㄟ^指定服務(wù)器的地址和端口號(hào)來建立連接,并發(fā)送請(qǐng)求消息。服務(wù)器接收到請(qǐng)求后,處理請(qǐng)求并將結(jié)果封裝成響應(yīng)消息返回給客戶端。
這種模型具有以下幾個(gè)特點(diǎn):
- 分工明確:客戶端負(fù)責(zé)發(fā)送請(qǐng)求和展示結(jié)果,服務(wù)器負(fù)責(zé)處理請(qǐng)求和提供服務(wù)。
- 可擴(kuò)展性:通過增加服務(wù)器的數(shù)量可以提高系統(tǒng)的性能和容量。
- 可靠性:專門的服務(wù)器設(shè)備可以提供穩(wěn)定的服務(wù),并進(jìn)行備份和故障恢復(fù)。
- 統(tǒng)一標(biāo)準(zhǔn):使用標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議,使得各種不同類型的客戶端能夠與服務(wù)器進(jìn)行通信。
1.1.2 B/S架構(gòu)(瀏覽器-服務(wù)器模型)
瀏覽器-服務(wù)器模型是客戶端-服務(wù)器模型的一種特殊形式,其中客戶端使用的是瀏覽器作為用戶界面。描述了在Web應(yīng)用程序中,瀏覽器和服務(wù)器之間的交互方式。
- 在這個(gè)模型中,用戶通過瀏覽器向服務(wù)器發(fā)出請(qǐng)求,瀏覽器充當(dāng)客戶端的角色,并從服務(wù)器獲取 Web 頁面的內(nèi)容。
- 具體來說,當(dāng)用戶在瀏覽器中輸入U(xiǎn)RL或點(diǎn)擊鏈接時(shí),瀏覽器會(huì)發(fā)送HTTP請(qǐng)求到特定的服務(wù)器。該請(qǐng)求包含了用戶要訪問的資源的信息,比如HTML文件、圖片、CSS樣式表或JavaScript代碼等。
- 服務(wù)器根據(jù)請(qǐng)求的路徑和參數(shù)進(jìn)行處理,將所需的資源打包成HTTP響應(yīng)返回給瀏覽器。
- 根據(jù)請(qǐng)求生成動(dòng)態(tài)的 HTML 頁面或提供靜態(tài)的資源,并將其發(fā)送回瀏覽器進(jìn)行顯示。
- 在這個(gè)交互過程中,瀏覽器和服務(wù)器之間通過HTTP協(xié)議進(jìn)行通信。HTTP定義了一套規(guī)范,規(guī)定了請(qǐng)求和響應(yīng)的格式,以及一些狀態(tài)碼和標(biāo)頭字段的含義。
瀏覽器-服務(wù)器模型的優(yōu)點(diǎn)包括:
- 客戶端無需事先安裝特定程序,只要有瀏覽器即可訪問Web資源。
- 服務(wù)器端可以集中管理和提供資源,對(duì)用戶來說更加方便。
- Web應(yīng)用程序的開發(fā)可以分為前端和后端,在不同層面上進(jìn)行開發(fā),使任務(wù)分工更清晰。
1.2 域名系統(tǒng)(DNS)
域名系統(tǒng)(Domain Name System,DNS)是互聯(lián)網(wǎng)中用于將域名轉(zhuǎn)換為IP地址的分布式命名系統(tǒng)。它充當(dāng)了互聯(lián)網(wǎng)中的"電話簿",將易于記憶的域名映射到對(duì)應(yīng)的IP地址。DNS系統(tǒng)采用人們更喜歡使用具有特定含義的字符串來標(biāo)識(shí)因特網(wǎng)上的計(jì)算機(jī)??蛻?服務(wù)器模型,其協(xié)議運(yùn)行在UDP之上,使用53號(hào)端口。
在Web上,我們通常使用域名來訪問網(wǎng)站,例如www.example.com。然而,計(jì)算機(jī)和網(wǎng)絡(luò)通信使用的是IP地址,如192.0.2.1。DNS的主要作用是將這兩者進(jìn)行關(guān)聯(lián)。
1.2.1 層次域名空間
層次域名空間是指域名系統(tǒng)(DNS)中的層次和結(jié)構(gòu)化組織。它通過將域名劃分為不同級(jí)別的域名,并按照層次結(jié)構(gòu)進(jìn)行管理和解析。
因特網(wǎng)采用層次樹狀結(jié)構(gòu)的命名方法。采用這種命名方法,任何一個(gè)連接到因特網(wǎng)的主機(jī)或路由器,都有一個(gè)唯一的層次結(jié)構(gòu)名稱,即域名(Domain Name)。
域(Domain)是名字空間中一個(gè)可被管理的劃分。域還可以劃分為子域,而子域還可以繼續(xù)劃分為子域的子域,這樣就形成了頂級(jí)域、二級(jí)域、三級(jí)域等。每個(gè)域名都由標(biāo)號(hào)序列組成,而各標(biāo)號(hào)之間用點(diǎn)(“.”)隔開。
注意:
- 標(biāo)號(hào)中的英文不區(qū)分大小寫。
- 標(biāo)號(hào)中除連字符外不能使用其他的標(biāo)點(diǎn)符號(hào)。
- 每個(gè)標(biāo)號(hào)不超過63個(gè)字符,多標(biāo)號(hào)組成的完整域名最長不超過255個(gè)字符。
- 級(jí)別最低的域名寫在最左邊,級(jí)別最高的頂級(jí)域名寫在最右邊。
1.2.2 域名服務(wù)器
域名服務(wù)器是一個(gè)網(wǎng)絡(luò)服務(wù),用于將域名轉(zhuǎn)換為相應(yīng)的IP地址。它充當(dāng)域名解析的中心樞紐,在互聯(lián)網(wǎng)上提供域名與IP地址之間的映射關(guān)系。
當(dāng)用戶在瀏覽器或其他網(wǎng)絡(luò)應(yīng)用程序中輸入一個(gè)域名時(shí),操作系統(tǒng)會(huì)向本地域名服務(wù)器發(fā)起查詢請(qǐng)求。如果本地域名服務(wù)器擁有該域名的緩存信息,則直接返回對(duì)應(yīng)的IP地址。否則,本地域名服務(wù)器會(huì)通過遞歸查詢的方式向更高級(jí)的域名服務(wù)器進(jìn)行查詢。
- 域名服務(wù)器按照層次結(jié)構(gòu)組織,其中最頂層的是根域名服務(wù)器。
- 根域名服務(wù)器負(fù)責(zé)管理頂級(jí)域名(TLD)的信息,如.com、.org等。
- 當(dāng)本地域名服務(wù)器無法直接解析域名時(shí),它會(huì)向根域名服務(wù)器發(fā)送查詢請(qǐng)求,以獲取下一級(jí)域名服務(wù)器的信息。
2 HTTP概述
萬維網(wǎng)(World Wide Web,WWW)是一個(gè)分布式、聯(lián)機(jī)式的信息存儲(chǔ)空間,在這個(gè)空間中:一樣有用的事物稱為一樣“資源”,并由一個(gè)全域“統(tǒng)一資源定位符”(URL)標(biāo)識(shí)。這些資源通過超文本傳輸協(xié)議(HTTP)傳送給使用者,而后者通過單擊鏈接來獲取資源。
2.1 什么是HTTP
超文本傳輸協(xié)議(Hypertext Transfer Protocol,HTTP)是一個(gè)簡(jiǎn)單的請(qǐng)求-響應(yīng)協(xié)議,它通常運(yùn)行在TCP之上。它指定了客戶端可能發(fā)送給服務(wù)器什么樣的消息以及得到什么樣的響應(yīng)。
HTTP定義了瀏覽器(萬維網(wǎng)客戶進(jìn)程)怎樣向萬維網(wǎng)服務(wù)器請(qǐng)求萬維網(wǎng)文檔,以及服務(wù)器怎樣把文檔傳送給瀏覽器。
從層次的角度看,HTTP是面向事務(wù)的(Transaction-oriented)應(yīng)用層協(xié)議,它規(guī)定了在瀏覽器和服務(wù)器之間的請(qǐng)求和響應(yīng)的格式與規(guī)則,是萬維網(wǎng)上能夠可靠地交換文件(包括文本、聲音、圖像等各種多媒體文件)的重要基礎(chǔ)。
在計(jì)算機(jī)網(wǎng)絡(luò)中,Web是一種應(yīng)用,在7層模型中運(yùn)行在最上層的應(yīng)用層,HTTP是支持Web這種應(yīng)用的協(xié)議。
2.2 HTTP的工作原理
從協(xié)議執(zhí)行過程來說,瀏覽器要訪問WWW服務(wù)器時(shí),首先要完成對(duì)WWW服務(wù)器的域名解析。一旦獲得了服務(wù)器的IP地址,瀏覽器就通過TCP向服務(wù)器發(fā)送連接建立請(qǐng)求。
HTTP是基于B/S架構(gòu)通信的,也就是瀏覽器/服務(wù)器架構(gòu)。在這個(gè)模型中,客戶端也就是瀏覽器,用于請(qǐng)求、接收和顯示W(wǎng)eb對(duì)象;服務(wù)器用于對(duì)請(qǐng)求進(jìn)行相應(yīng),發(fā)送客戶端需要的對(duì)象。
HTTP的工作流程如下圖所示
- 每一個(gè)萬維網(wǎng)站點(diǎn)也就是服務(wù)器,都有一個(gè)服務(wù)器進(jìn)程,它永遠(yuǎn)守候在80號(hào)端口進(jìn)行監(jiān)聽。
- 當(dāng)監(jiān)聽到客戶的請(qǐng)求時(shí),便與其建立TCP連接,并分配一個(gè)新的socket指向與這個(gè)用戶的會(huì)話關(guān)系,用于與其進(jìn)行通信。
- 與此同時(shí),服務(wù)器仍然監(jiān)聽80號(hào)端口,查看是否有新的客戶端請(qǐng)求建立連接,若有則重復(fù)上述步驟。
- 在這里,80號(hào)端口稱為守候進(jìn)程(Waiting Socket),新的socket稱為連接進(jìn)程(Connection Socket)。
用瀏覽器訪問一個(gè)URL所經(jīng)歷的過程:
- 瀏覽器分析鏈接指向頁面的 URL。
- 瀏覽器向 DNS 請(qǐng)求解析上面URL的IP地址。
- 域名系統(tǒng)DNS解析出清華大學(xué)服務(wù)器的IP地址。
- 瀏覽器與該服務(wù)器建立TCP連接(默認(rèn)端口號(hào)為80)。
- 瀏覽器發(fā)出 HTTP請(qǐng)求:GET/index.htm
- 服務(wù)器通過HTTP響應(yīng)把文件index.htm發(fā)送給瀏覽器。
- 釋放TCP連接。
- 瀏覽器解釋文件index.htm,并將 Web 頁顯示給用戶。
3 HTTP的發(fā)展階段
HTTP協(xié)議的發(fā)展經(jīng)歷了幾個(gè)階段,最主要的發(fā)展就是非持續(xù)連接和持續(xù)連接的區(qū)別。每個(gè)請(qǐng)求/相應(yīng)是經(jīng)過一個(gè)單獨(dú)的TCP連接發(fā)送的稱為非持續(xù)連接,如果所有的請(qǐng)求及其相應(yīng)都是經(jīng)過相同的TCP連接發(fā)送的,則稱為持續(xù)連接。
3.1 采用非持續(xù)連接的HTTP
- 客戶端發(fā)起一個(gè)與服務(wù)器的TCP連接(建立套接字),端口號(hào)為80
- 服務(wù)器接受客戶端的TCP連接
- 在瀏覽器與Web服務(wù)器交換HTTP報(bào)文
- TCP連接關(guān)閉
其中,每一個(gè)TCP連接在服務(wù)器發(fā)送一個(gè)對(duì)象后關(guān)閉,而且每個(gè)TCP連接只傳輸一個(gè)請(qǐng)求報(bào)文和一個(gè)響應(yīng)報(bào)文。
這種協(xié)議是無狀態(tài)的也稱為非持久HTTP,即服務(wù)器不保留與客戶交易時(shí)的任何狀態(tài)。這就大大減輕了服務(wù)器記憶負(fù)擔(dān),從而保持較快的響應(yīng)速度。
3.2 采用持續(xù)連接的HTTP
在HTTP 1.1中,引入了保持活動(dòng)機(jī)制,其中連接可以重用于多個(gè)請(qǐng)求。這樣的持久性連接可以明顯減少請(qǐng)求延遲,因?yàn)樵诎l(fā)送第一個(gè)請(qǐng)求之后,客戶端不需要重新進(jìn)行TCP 三次握手連接。另一個(gè)積極的副作用是,通常,由于TCP的緩慢啟動(dòng)機(jī)制,連接隨著時(shí)間的推移而變得更快。
持續(xù)連接有分為非流水線和流水線兩種方式:
- 對(duì)于非流水線方式,客戶在收到前一個(gè)響應(yīng)后才能發(fā)出下一個(gè)請(qǐng)求,服務(wù)器發(fā)送完一個(gè)對(duì)象后,其TCP連接就處于空閑狀態(tài),浪費(fèi)了服務(wù)器資源。
- HTTP 1.1 的默認(rèn)方式是使用流水線的持久連接,這種情況下,客戶每遇到一個(gè)對(duì)象引用就立即發(fā)出一個(gè)請(qǐng)求,因而客戶可以逐個(gè)地連續(xù)發(fā)出對(duì)各個(gè)引用對(duì)象的請(qǐng)求。就像是滑動(dòng)窗口的發(fā)送方式。
- 如果所有的請(qǐng)求和響應(yīng)都是連續(xù)發(fā)送的,那么所有的引用對(duì)象共經(jīng)歷1個(gè)RTT延遲,而不像非水線方式那樣,每個(gè)引用都必須有1個(gè)RTT延遲。
這種方式減少了TCP 連接中的空閑時(shí)間,提高了效率。
4 HTTP報(bào)文結(jié)構(gòu)
在瀏覽器和服務(wù)器之間的請(qǐng)求與響應(yīng)的交互,必須遵循規(guī)定的格式和規(guī)則,這些格式和規(guī)則就是HTTP。因此 HTTP有兩類報(bào)文:請(qǐng)求報(bào)文和響應(yīng)報(bào)文。我們做爬蟲,正是通過獲取并分析這些報(bào)文來分辨是否是我們要獲得的信息。
HTTP有兩種報(bào)文,請(qǐng)求報(bào)文和響應(yīng)報(bào)文,結(jié)構(gòu)如上圖所示。
HTTP請(qǐng)求報(bào)文和響應(yīng)報(bào)文都由三個(gè)部分組成。從圖中可以看出,這兩種報(bào)文格式的區(qū)別就是開始行不同。本節(jié)主要介紹每個(gè)字段的意義以及存儲(chǔ)的內(nèi)容,下一篇文章通過實(shí)戰(zhàn),帶你了解在瀏覽器中看一下這些報(bào)文到底在哪。
- 開始行:
用于區(qū)分是請(qǐng)求報(bào)文還是響應(yīng)報(bào)文。在請(qǐng)求報(bào)文中的開始行稱為請(qǐng)求行,而在響應(yīng)報(bào)文中的開始行稱為狀態(tài)行。開始行的三個(gè)字段之間都以空格分隔,最后的“CR”和“LF”分別代表“回車”和“換行”。
請(qǐng)求報(bào)文的“請(qǐng)求行”有三個(gè)內(nèi)容:方法、請(qǐng)求資源的URL及HTTP的版本。其中,“方法”是對(duì)所請(qǐng)求對(duì)象進(jìn)行的操作,這些方法實(shí)際上也就是一些命令。下表給出了HTTP請(qǐng)求報(bào)文中常用的幾個(gè)方法。
方法(操作) | 意義 |
---|---|
GET | 請(qǐng)求讀取由URL標(biāo)識(shí)的信息 |
HEAD | 請(qǐng)求讀取由URL標(biāo)識(shí)的信息的首部 |
POST | 給服務(wù)器添加信息(如注釋) |
CONNECT | 用于代理服務(wù)器 |
- 首部行:
用來說明瀏覽器、服務(wù)器或報(bào)文主體的一些信息。首部可以有幾行,但也可以不使用。
在每個(gè)首部行中都有首部字段名和它的值,每一行在結(jié)束的地方都要有“回車”和“換行”。整個(gè)首部行結(jié)束時(shí),還有一空行將首部行和后面的實(shí)體主體分開。
- 狀態(tài)碼:
響應(yīng)報(bào)文中的狀態(tài)行中有一個(gè)狀態(tài)碼字段,它描述了請(qǐng)求的結(jié)果。下表說明了主要的狀態(tài)碼和對(duì)應(yīng)的意義
狀態(tài)碼 | 意義 |
---|---|
200 OK | 請(qǐng)求成功,信息在返回的響應(yīng)報(bào)文中 |
201 Created | 請(qǐng)求成功,并在服務(wù)器上創(chuàng)建了新資源 |
204 No Content | 請(qǐng)求成功,但響應(yīng)中沒有返回任何內(nèi)容 |
301 Moved Permanently | 請(qǐng)求的對(duì)象已經(jīng)被永遠(yuǎn)的轉(zhuǎn)移了,新的URL定義在響應(yīng)報(bào)文的Location,首部行中,客戶軟件將自動(dòng)獲取新的URL |
400 Bad Request | 一個(gè)通用的差錯(cuò)代碼,指示該請(qǐng)求不能被服務(wù)器理解 |
401 Unauthorized | 請(qǐng)求未被授權(quán),需要提供有效的身份驗(yàn)證信息 |
403 Forbidden | 請(qǐng)求被服務(wù)器拒絕,通常是因?yàn)闄?quán)限不足 |
404 Not Found | 被請(qǐng)求的文檔不在服務(wù)器上 |
500 Internal Server Error | 服務(wù)器內(nèi)部發(fā)生錯(cuò)誤,無法完成請(qǐng)求 |
505 HTTP Version Not Supported | 服務(wù)器不支持請(qǐng)求報(bào)文使用的HTTP協(xié)議版本 |
5 用戶與服務(wù)器的交互:Cookie
我們前面提到了HTTP服務(wù)器是無狀態(tài)的。這簡(jiǎn)化了服務(wù)器的設(shè)計(jì),并且允許工程師們?nèi)ラ_發(fā)可以同時(shí)處理數(shù)以千計(jì)的TCP連接的高性能Web服務(wù)器。
然而有的站點(diǎn)希望根據(jù)不同的用戶推送不同的內(nèi)容,并且在下一次訪問時(shí)可以找到之前的訪問記錄,根據(jù)以前的訪問進(jìn)行本次訪問。為此,HTTP使用了cookie,它允許站點(diǎn)對(duì)用戶進(jìn)行跟蹤。
目前大多數(shù)商務(wù)Web 站點(diǎn)都使用了cookie。
如下圖所示,cookie技術(shù)有4個(gè)組件:
- 在 HTTP響應(yīng)報(bào)文中的一個(gè)cookie首部行;
- 在 HTTP請(qǐng)求報(bào)文中的一個(gè)cookie首部行;
- 在用戶端系統(tǒng)中保留有一個(gè)cookie文件,并由用戶的瀏覽器進(jìn)行管理;
- 位于Web站點(diǎn)的一個(gè)后端數(shù)據(jù)庫。
并且下圖用一個(gè)例子說明了cookie的工作過程:
從上述過程中我們看到,cookie可以用于標(biāo)識(shí)一個(gè)用戶。
- 用戶首次訪問一個(gè)站點(diǎn)時(shí),可能需要提供一個(gè)用戶標(biāo)識(shí)(可能是名字)。
- 在后繼會(huì)話中,瀏覽器向服務(wù)器傳遞一個(gè)cookie首部,從而向該服務(wù)器標(biāo)識(shí)了用戶。
- 因此cookie可以在無狀態(tài)的HTTP之上建立一個(gè)用戶會(huì)話層。
在后續(xù)的爬蟲編程中,我們也會(huì)用到cookie。
6 Web緩存
在本文的以上內(nèi)容中,我們介紹的都是客戶端直接訪問服務(wù)器。但是這樣的操作往往會(huì)使得服務(wù)器的負(fù)擔(dān)較重,這時(shí),如果有一個(gè)代理,能夠?qū)⒁徊糠謨?nèi)容拿出來,幫助Web服務(wù)器完成用戶的訪問,那么無論是對(duì)于用戶還是服務(wù)器來說都是有利的。
Web緩存(Web cache)也稱代理服務(wù)器(proxy server),它是能夠代表初始Web服務(wù)器來滿足HTTP請(qǐng)求的網(wǎng)絡(luò)實(shí)體。Web緩存器有自己的磁盤存儲(chǔ)空間,并在存儲(chǔ)空間中保存最近請(qǐng)求過的對(duì)象的副本。
使用Web緩存處理客戶端請(qǐng)求的過程:
- 瀏覽器創(chuàng)建一個(gè)到Web 緩存器的 TCP連接,并向Web緩存器中的對(duì)象發(fā)送一個(gè)HTTP請(qǐng)求。
- Web緩存器進(jìn)行檢查,看看本地是否存儲(chǔ)了該對(duì)象副本。如果有,Web緩存器就向客戶瀏覽器用HTTP響應(yīng)報(bào)文返回該對(duì)象。
- 如果 Web緩存器中沒有該對(duì)象,它就打開一個(gè)與該對(duì)象的初始服務(wù)器的TCP連接。Web緩存器則在這個(gè)緩存器到服務(wù)器的TCP連接上發(fā)送一個(gè)對(duì)該對(duì)象的HTTP請(qǐng)求。在收到該請(qǐng)求后,初始服務(wù)器向該Web緩存器發(fā)送具有該對(duì)象的HTTP響應(yīng)。
- 當(dāng)Web緩存器接收到該對(duì)象時(shí),它在本地存儲(chǔ)空間存儲(chǔ)一份副本,并向客戶的瀏覽器用HTTP 響應(yīng)報(bào)文發(fā)送該副本(通過現(xiàn)有的客戶瀏覽器和Web緩存器之間的TCP 連接)。
建立Web緩存的好處:
- 可以大大減少對(duì)客戶請(qǐng)求的響應(yīng)時(shí)間。
- 能夠大大減少一個(gè)機(jī)構(gòu)的接入鏈路到因特網(wǎng)的通信量,從而不必增加帶寬,降低了費(fèi)用。
7 條件GET方法
雖然Web緩存可以幫助我們減少請(qǐng)求時(shí)間以及服務(wù)器的負(fù)擔(dān),但是存在一個(gè)缺點(diǎn):當(dāng)上次請(qǐng)求的內(nèi)容在服務(wù)器中已經(jīng)修改,則此時(shí)的內(nèi)容與Web緩存中的內(nèi)容不一致,為此,我們必須知道該內(nèi)容在服務(wù)器中是否進(jìn)行的修改,這種機(jī)制就是條件GET方法(conditional GET)。
如果請(qǐng)求報(bào)文使用GET方法;并且,請(qǐng)求報(bào)文中包含一個(gè)“If-Modified-Since:”首部行。那么,這個(gè)HTTP請(qǐng)求報(bào)文就是一個(gè)條件GET請(qǐng)求報(bào)文。文章來源:http://www.zghlxwxcb.cn/news/detail-519727.html
操作流程:文章來源地址http://www.zghlxwxcb.cn/news/detail-519727.html
- 首先,代理服務(wù)器代表一個(gè)請(qǐng)求瀏覽器,向某個(gè)Web服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文
- 其次,該Web服務(wù)器向緩存發(fā)送具有被請(qǐng)求的對(duì)象的響應(yīng)報(bào)文
- 該緩存器在將對(duì)象轉(zhuǎn)發(fā)到請(qǐng)求的瀏覽器的同時(shí),也在本地緩存了該對(duì)象。
- 重要的是,緩存器在存儲(chǔ)該對(duì)象時(shí)也存儲(chǔ)了最后修改日期。
- 最后,一個(gè)星期后,另一個(gè)用戶經(jīng)過該緩存器請(qǐng)求同一個(gè)對(duì)象,該對(duì)象仍在這個(gè)緩存器中。
- 由于在過去的一個(gè)星期中位于Web服務(wù)器上的該對(duì)象可能已經(jīng)被修改了,該緩存器通過發(fā)送一個(gè)條件GET 執(zhí)行最新檢查。下面是該緩存器發(fā)送的報(bào)文:
- 在If-Modified-Sincce字段中,首部行的值正好等于一星期錢服務(wù)器發(fā)送的響應(yīng)報(bào)文中的Last-Modified
- 則Web服務(wù)器向該緩存中發(fā)送一個(gè)響應(yīng)報(bào)文:
- 作為該條件GET方法的響應(yīng),服務(wù)器仍發(fā)送一個(gè)響應(yīng)報(bào)文,但是并沒有在該響應(yīng)報(bào)文中包含所請(qǐng)求的對(duì)象。
到了這里,關(guān)于【Python爬蟲開發(fā)基礎(chǔ)⑥】計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)(Web和HTTP)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!