爬蟲是乙個模擬瀏覽器進行 http 請求的過程。
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 這個資源,它的路徑在伺服器 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
# 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 協議還很定義了很多其他的狀態碼,不過它不是本文的討論範圍。
響應首部
響應首部和請求首部類似,用於對響應內容的補充,在首部裡面可以告知客戶端響應體的資料型別是什麼?響應內容返回的時間是什麼時候,響應體是否壓縮了,響應體最後一次修改的時間。
響應體
我們繼續沿用前面那個例子來看看伺服器返回的響應結果是什麼?因為我只接收了前1024個位元組,所以有一部分響應內容是看不到的。
...從結果來看,它與協議中規範的格式是一樣的,第一行是響應行,狀態碼是200,表明請求成功。第二部分是響應首部資訊,由多個首部組成,有伺服器返回響應的時間,cookie資訊等等。第三部分就是真正的響應體 html 文字。
至此,你應該對 http 協議有乙個總體的認識了,爬蟲的行為本質上就是模擬瀏覽器傳送http請求,所以要想在爬蟲領域深耕細作,理解 http 協議是必須的。
爬蟲系列文章
SIP協議初探
1.sip協議的定義 2.sip協議特點 位於應用層,作用 主要控制通訊雙方的信令。h.323和sip分別是通訊領域與網際網路兩大陣營推出的協議。h.323企圖把ip 當作是眾所周知的傳統 只是傳輸方式發生了改變,由電路交換變成了分組交換。而sip協議側重於將ip 作為網際網路上的乙個應用,較其它應...
初探HTTPS協議
概述 http協議屬於明文傳輸協議,互動過程以及資料傳輸都沒有進行過加密,通訊雙方也沒有進行身份驗證,通訊過程非常容易遭到劫持,篡改等安全問題,為了提高網路傳輸的安全性,https應運而生.相比http,https提供了以下三個特性 資料完整性 內容傳輸經過完整性校驗 資料私隱性 內容經過對稱加密,...
kerberos 協議初探
乙個客戶端要訪問某個服務時,先要到kdc去認證自己,並獲得訪問票據tgt 然後客戶端再拿著這個訪問票據到自己真實想要訪問的服務去獲得訪問授權,然後真實的進行訪問 在kerberos中,kdc有兩部分組成 authentication server,用來認證使用者,即驗證使用者存在,且密碼正確 tic...