http 簡介

來源:互聯網
上載者:User

標籤:div   資料   閱讀   url   簡介   nal   額外   報文   meta   

HTTP協議是什嗎?

你瀏覽的每一個網頁都是基於 HTTP 協議呈現的,HTTP 協議是互連網應用中,用戶端(瀏覽器)與伺服器之間進行資料通訊的一種協議。協議中規定了用戶端應該按照什麼格式給伺服器發送請求,同時也約定了服務端返回的響應結果應該是什麼格式。

只要大家都按照協議規定方式發起請求和返迴響應結果,任何人都可以基於HTTP協議實現自己的Web用戶端(瀏覽器、爬蟲)和Web伺服器(Nginx、Apache等)。

HTTP 協議本身是非常簡單的。它規定,只能由用戶端主動發起請求,伺服器接收請求處理後返迴響應結果,同時 HTTP 是一種無狀態的協議,協議本身不記錄用戶端的曆史請求記錄。

HTTP 協議是如何規定請求格式和響應格式的呢?換言之,用戶端按照什麼格式才能正確發起 HTTP 要求呢?服務端按照什麼格式返迴響應結果用戶端才能正確解析?

HTTP 要求

HTTP 要求由3部分組成,分別是請求行、請求首部、請求體,首部和請求體是可選的,並不是每個請求都需要的。

請求行

請求行是每個請求必不可少的部分,它由3部分組成,分別是要求方法(method)、請求URL(URI)、HTTP協議版本,以空格隔開。

HTTP協議中最常用的要求方法有:GET、POST、PUT、DELETE。GET 方法用於從伺服器擷取資源,90%的爬蟲都是基於GET請求抓取資料。

請求 URL 是指資源所在伺服器的路徑地址,比如的例子表示用戶端想擷取 index.html 這個資源,它的路徑在伺服器 http://foofish.net 的根目錄(/)下面。

請求首部

因為請求行所攜帶的資訊量非常有限,以至於用戶端還有很多想向伺服器要說的事情不得不放在請求首部(Header),請求首部用於給伺服器提供一些額外的資訊,比如 User-Agent 用來表明用戶端的身份,讓伺服器知道你是來自瀏覽器的請求還是爬蟲,是來自 Chrome 瀏覽器還是 FireFox。HTTP/1.1 規定了47種首部欄位類型。HTTP首部欄位的格式很像 Python 中的字典類型,由索引值對組成,中間用冒號隔開。比如:

User-Agent: Mozilla/5.0

因為用戶端發送請求時,發送的資料(報文)是由字串構成的,為了區分請求首部的結尾和請求體的開始,用一個空行來表示,遇到空行時,就表示這是首部的結尾,請求體的開始。

請求體

請求體是用戶端提交給伺服器的真正內容,比如使用者登入時的需要用的使用者名稱和密碼,比如檔案上傳的資料,比如註冊使用者資訊時提交的表單資訊。

現在我們用 Python 提供的最原始API socket 模組來類比向伺服器發起一個 HTTP 要求

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:    # 1. 與伺服器建立串連    s.connect(("www.seriot.ch", 80))    # 2. 構建請求行,請求資源是 index.php    request_line = b"GET /index.php HTTP/1.1"    # 3. 構建請求首部,指定主機名稱    headers = b"Host: seriot.ch"    # 4. 用空行標記請求首部的結束位置    blank_line = b"\r\n"    # 請求行、首部、空行這3部分內容用分行符號分隔,組成一個請求報文字串    # 發送給伺服器    message = b"\r\n".join([request_line, headers, blank_line])    s.send(message)    # 伺服器返回的響應內容稍後進行分析    response = s.recv(1024)    print(response)
HTTP 響應

服務端接收請求並處理後,返迴響應內容給用戶端,同樣地,響應內容也必須遵循固定的格式瀏覽器才能正確解析。HTTP 響應也由3部分組成,分別是:響應行、響應首部、響應體,與 HTTP 的請求格式是相對應的。

響應行

響應行同樣也是3部分組成,由服務端支援的 HTTP 協議版本號碼、狀態代碼、以及對狀態代碼的簡短原因描述組成。

狀態代碼是響應行中很重要的一個欄位。通過狀態代碼,用戶端可以知道伺服器是否正常處理的請求。如果狀態代碼是200,說明用戶端的請求處理成功,如果是500,說明伺服器處理請求的時候出現了異常。404 表示請求的資源在伺服器找不到。除此之外,HTTP 協議還很定義了很多其他的狀態代碼,不過它不是本文的討論範圍。

響應首部

響應首部和請求首部類似,用於對響應內容的補充,在首部裡面可以告知用戶端響應體的資料類型是什嗎?響應內容返回的時間是什麼時候,響應體是否壓縮了,響應體最後一次修改的時間。

響應體

響應體(body)是伺服器返回的真正內容,它可以是一個HTML頁面,或者是一張圖片、一段視頻等等。

我們繼續沿用前面那個例子來看看伺服器返回的響應結果是什嗎?因為我只接收了前1024個位元組,所以有一部分響應內容是看不到的。

b‘HTTP/1.1 200 OK\r\nDate: Tue, 04 Apr 2017 16:22:35 GMT\r\nServer: Apache\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nSet-Cookie: PHPSESSID=66bea0a1f7cb572584745f9ce6984b7e; path=/\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n118d\r\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n<head>\n\t    <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />    \n\t    <meta http-equiv="content-language" content="en" />\n\t...</html>

從結果來看,它與協議中規範的格式是一樣的,第一行是響應行,狀態代碼是200,表明請求成功。第二部分是響應首部資訊,由多個首部組成,有伺服器返迴響應的時間,Cookie資訊等等。第三部分就是真正的響應體 HTML 文本。

至此,你應該對 HTTP 協議有一個總體的認識了,爬蟲的行為本質上就是類比瀏覽器發送HTTP請求,所以要想在爬蟲領域深耕細作,理解 HTTP 協議是必須的。

當然 HTTP 協議遠不止這麼一點內容,也根本不可能用一篇文章就試圖把它全部講清楚,我在這裡也只是拋磚引玉,想深入瞭解HTTP的,可參考「Python之禪」推薦的延伸閱讀。

http 簡介

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.