【Python网络蜘蛛】:基础 - HTTP基本原理
文章目錄
- 1.1 HTTP基本原理
- 1. URI和URL
- 2. HTTP和HTTPS
- 3. HTTP請求過程
- 4. 請求
- 5. 響應
1.1 HTTP基本原理
1. URI和URL
URI為統一資源標識符,URL為統一資源定位符。
舉個例子理解:http://github.com/favicon.ico 既是一個URI,也是一個URL,即有一個圖標資源favicon.ico,我們用URI/URL指定了訪問它的唯一方式,其中包括訪問協議https、訪問路徑和資源名稱。通過一個鏈接,便可以從互聯網中找到某個資源,這個鏈接就是URI/URL。
URL是URI的子集,即每個URL都是URI,但并非每個URI都是URL。
2. HTTP和HTTPS
在爬蟲中,我們抓取的頁面通常是基于http或https協議的。
HTTP:中文名為超文本傳輸協議,其作用是把超文本數據從網絡傳輸到本地瀏覽器,能夠保證高效而準確地傳輸超文本文檔。
HTTPS:全稱是Hypertext Transfer Protocol over Secure Socket Layer,是以安全為目標地HTTP通道,簡單講就是HTTP的安全版,即在HTTP下加入SSL層,簡稱HTTPS。
(HTTPS的安全基礎是SSL,因此通過該協議傳輸的內容都是經過SSL加密的)
3. HTTP請求過程
在瀏覽器地址欄中輸入一個URL,按下回車之后便可觀察到對應的頁面內容。實際上,這個過程是瀏覽器先向網站所在的服務器發送一個請求,網站服務器接收到請求后對其進行處理和解析,然后返回對應的響應,接著傳回瀏覽器。
為了更直觀地說明上述過程,這里用Chrome瀏覽器開發者模式下的Network監聽組件來做一下演示。
打開Chrome瀏覽器,訪問百度,鼠標右鍵,點擊“檢查”,點擊Network
先觀察第一個網絡請求,即www.baidu.com,其中各列的含義如下。
- 第一列Name:請求的名稱。一般用URL的最后一部分內容作為名稱。
- 第二列Status:響應的狀態碼。這里顯示為200,代表響應是正常的。通過狀態碼,我們可以判斷發送請求之后是否得到了正常的響應。
- 第三列Protocol:請求協議類型。這里http/1.1代表HTTP1.1版本,h2代表HTTP2.0版本。
- 第四列Type:請求的文檔類型。這里document,代表我們這次請求是一個HTML文檔,內容是一些HTML代碼。
- 第五列Initiator:請求源。用來標記請求是由哪個對象或進程發起的。
- 第六列Size:從服務器下載的文件或請求資源的大小。如果資源是從緩存中取得的,則該列會顯示from cache。
- 第八列Waterfall:網絡請求的可視化瀑布流。
4. 請求
請求分為四部分內容:請求方法(Request Method)、請求的網址(Request URL)、請求頭(Request Headers)、請求體(Request Body)。
4.1 請求方法
用于標識請求客戶端請求服務端的方式,常見的請求方法有兩種:GET和POST。
舉例理解:在百度引擎中搜索Python就是一個GET請求,鏈接為 http://www.baidu.com/s?wd=Python,其中URL中包含了請求的query信息,這里的參數wd表示要搜尋的關鍵字。POST請求大多在提交表單時發起。例如,對于一個登錄表單,輸入用戶名和密碼后,單擊“登錄”按鈕,這時通常會發起一個POST請求,其數據通常以表單的形式傳輸,而不會體現在URL中。
GET和POST請求方法的區別:
GET請求中的參數包含在URL里面,數據可以在URL中看到;而POST請求的URL不會包含這些數據,數據都是通過表單形式傳輸的,會包含在請求體中。
| GET | 請求頁面,并返回頁面內容 |
| HEAD | 類似于GET請求,只不過返回的響應中沒有具體內容。用于獲取報頭 |
| POST | 大多用于提交表單或上傳文件,數據包含在請求體中 |
| PUT | 用客戶端傳向服務器的數據取代指定文檔中的內容 |
| DELETE | 請求服務器刪除指定的頁面 |
| CONNECT | 把服務器當作跳板,讓服務器代替客戶端訪問其他頁面 |
| OPTIONS | 允許客戶端查看服務器性能 |
| TRACE | 會顯示服務器收到的請求。只要用于測試或診斷 |
4.2 請求的網址
請求的網址,它可以唯一確定客戶端想請求的資源,即URL。
4.3請求頭
簡要說明一些常用的請求頭信息:
- Accept:請求報頭域,用于指定客戶端可接受哪些類型的信息。
- Accept-Language:用于指定客戶端可接受的語言類型。
- Accept-Encoding:用于指定客戶端可接受的內容編碼。
- Host:用于指定請求資源的主機IP和端口號,其內容為請求URL的原始服務器或網關的位置。從 HTTP1.1版本開始,請求必須包含此內容。
- Cookie:也常用復數形式Cookies,這是網站為了辨別用戶,進行會話跟蹤而存儲在用戶本地的數據。它的主要功能是維持當前訪問會話。例如,輸入用戶名和密碼成功登錄某個網站后,服務器會用會話保存登錄狀態信息,之后每次刷新或請求該站點的其他頁面,都會發現處于登錄狀態,這就是Cookie的功勞。Cookie里有信息標識了我們所對應的服務器的會話,每次瀏覽器在請求該站點的頁面時,都會在請求頭中加上 Cookie并將其發送給服務器,服務器通過Cookie識別出是我們自己。并且查出當前狀態是登錄狀態,所以返回結果就是登錄之后才能看到的網頁內容。
- Referer:用于標識請求是從哪個頁面發過來的,服務器可以拿到這一信息并做相應的處理,如做來源統計、防盜鏈處理等。
- User-Agent:簡稱UA,這是一個特殊的字符串頭,可以使服務器識別客戶端使用的操作系統及版本、瀏覽器及版本等信息。做爬蟲時如果加上此信息,可以偽裝為瀏覽器;如果不加,很可能會被識別出來。
- Content-Type:也叫互聯網媒體類型(Internet Media Type)或者MIME類型,在HTTP協議消息頭中,它用來表示具體請求中的媒體類型信息。例如,text/html代表HTML格式,image/gif代表GIF圖片,application/json代表JSON類型。
4.4 請求體
請求體,一般承載的內容是POST請求中的表單數據,對于GET請求,請求體為空。
例如,登錄GitHub時捕獲到的請求和響應如下圖所示:
登錄之前,需要先填寫用戶名和密碼信息,登錄時這些內容會以表單數據的形式提交給服務器,此時需要注意Request Headers 中指定Content-Type 為 application/x-www-form-urlencoded。只有這樣設置Content-Type,內容才會以表單數據的形式提交。另外,也可以將Content-Type 設置為application/json來提交json數據,或者設置為multipart/form-data來上傳文件。
| application/x-www-form-urlencoded | 表單數據 |
| multipart/form-data | 表單文件上傳 |
| application/json | 序列化JSON數據 |
| text/xml | XML數據 |
5. 響應
5.1 響應狀態碼
常見的錯誤狀態碼及錯誤原因:
| 100 | 繼續 | 請求者應當繼續提出請求。服務器已校僅到明小·即力、I正在等待其余部分 |
| 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協議版本 |
5.2 響應頭
響應頭,包含了服務器對請求的應答信息,如Content-Type、Server、Set-Cookie等。下面簡要說明一些常用的響應頭信息。
- Date:用于標識響應產生的時間。
- Last-Modified:用于指定資源的最后修改時間。
- Content-Encoding:用于指定響應內容的編碼。
- Server:包含服務器的信息,例如名稱、版本號等。
- Content-Type:文檔類型,指定返回的數據是什么類型,如 texthtml 代表返回 HTML 文檔,application/x-javascript代表返回JavaScript文件,image/jpeg代表返回圖片。
- Set-Cookie:設置Cookie。響應頭中的Set-Cookie用于告訴瀏覽器需要將此內容放在Cookie中,下次請求時將Cookie攜帶上。
- Expires:用于指定響應的過期時間,可以讓代理服務器或瀏覽器將加載的內容更新到緩存中。當再次訪問相同的內容時,就可以直接從緩存中加載,達到降低服務器負載、縮短加載時間的目的。
總結
以上是生活随笔為你收集整理的【Python网络蜘蛛】:基础 - HTTP基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。