入門HTTP協(xié)議看這篇文章就夠了 - 爬蟲(chóng)和Web開(kāi)發(fā)必備!
時(shí)間:2023-08-19 14:18:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-08-19 14:18:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)
入門HTTP協(xié)議看這篇文章就夠了 - 爬蟲(chóng)和Web開(kāi)發(fā)必備?。篐TTP對(duì)于爬蟲(chóng)是
重中之重,對(duì)于學(xué)Web開(kāi)發(fā)(前端或者后端)也是
必備技能。本文涵蓋了HTTP的必要知識(shí)點(diǎn),把本文看透,基本夠用了,然后再按需適當(dāng)擴(kuò)展就可以了。
另外,文末也有視頻本教程的視頻鏈接。
1. 原理介紹
爬蟲(chóng)就是用程序模擬瀏覽器的行為,發(fā)送請(qǐng)求給服務(wù)器,獲取網(wǎng)頁(yè)的內(nèi)容,解析網(wǎng)頁(yè)數(shù)據(jù)。
要學(xué)會(huì)爬蟲(chóng),先要了解瀏覽器是如何和服務(wù)器交流的。瀏覽器通過(guò)HTTP協(xié)議和服務(wù)器交流。
2. HTTP協(xié)議簡(jiǎn)介
簡(jiǎn)介
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,主要用于網(wǎng)頁(yè)的傳輸,現(xiàn)在也常應(yīng)用網(wǎng)絡(luò)API的開(kāi)發(fā)(Restful API)。
HTTP是一個(gè)TCP/IP通信協(xié)議的最上層的協(xié)議之一(HTML 文件, 圖片文件, 查詢結(jié)果等)。TCP/IP協(xié)議有興趣的可以自行學(xué)習(xí),做Web開(kāi)發(fā)的需要學(xué)習(xí)一下,對(duì)于爬蟲(chóng)不是必要內(nèi)容。
以訪問(wèn)百度首頁(yè)為例,可以看到網(wǎng)址的最前面就是http。
這里是https,你可以暫時(shí)忽略后面的s,https相對(duì)于http添加了數(shù)字證書加密功能,這不影響正常的爬蟲(chóng)。但寫爬取的時(shí)候也要添加s,現(xiàn)在大部分網(wǎng)站都是https的。
了解https,請(qǐng)參考麥?zhǔn)宓奈恼拢溄右?jiàn)底部第一篇。
基本工作原理
HTTP是瀏覽器或者其他客戶端(如手機(jī)App)和網(wǎng)站服務(wù)器之間溝通的協(xié)議。
瀏覽器作為HTTP
客戶端通過(guò)
URL向HTTP服務(wù)端即
WEB服務(wù)器發(fā)送所有請(qǐng)求。
常用的Web服務(wù)器有:
Nginx,
Apache,
IIS服務(wù)器(微軟的產(chǎn)品)等。
Web服務(wù)器接收到的請(qǐng)求后,向客戶端發(fā)送響應(yīng)信息。
HTTP默認(rèn)端口號(hào)為80,但是你也可以改為8080或者其他端口。
HTTP三個(gè)要點(diǎn)
- HTTP是無(wú)連接: 無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開(kāi)連接。采用這種方式可以節(jié)省傳輸時(shí)間。
- HTTP是媒體獨(dú)立的: 這意味著,只要客戶端和服務(wù)器知道如何處理的數(shù)據(jù)內(nèi)容,任何類型的數(shù)據(jù)都可以通過(guò)HTTP發(fā)送。客戶端以及服務(wù)器指定使用適合的MIME-type內(nèi)容類型。
- HTTP是無(wú)狀態(tài): HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
3. chrome瀏覽器和開(kāi)發(fā)者工具
這個(gè)課程我們要使用chrome瀏覽器和它自帶的開(kāi)發(fā)者工具。
如果你還沒(méi)有安裝chrome瀏覽器,請(qǐng)下載和安裝Chrome瀏覽器,麥?zhǔn)甯咚夔R像下載地址:
https://blog.qingke.me/post/10我們可以使用chrome來(lái)查看http的請(qǐng)求信息,基本操作步驟如下:
- 在網(wǎng)頁(yè)上點(diǎn)右鍵,然后點(diǎn)檢查:
- 就會(huì)彈出開(kāi)發(fā)者工具界面
- 通過(guò)Elements我們可以看到網(wǎng)頁(yè)的代碼;通過(guò)Network我們可以看到HTTP的請(qǐng)求信息
4. HTTP的消息結(jié)構(gòu)
主要流程和概念
- 請(qǐng)求
- 地址和動(dòng)詞:例如 GET https://www.baidu.com
- 請(qǐng)求頭(header):用來(lái)描述請(qǐng)求和發(fā)送者的一些信息
- 請(qǐng)求參數(shù):以百度為例,要搜索的關(guān)鍵詞。
- 相應(yīng)
- 響應(yīng)代碼:200表示成功,404表示不存在等
- 響應(yīng)頭header:描述相應(yīng)內(nèi)容的一些信息
- 響應(yīng)內(nèi)容:HTML, JSON, 圖片等
請(qǐng)求和響應(yīng)例子
客戶端請(qǐng)求:
GET /hello.txt HTTP/1.1User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3Host: www.example.comAccept-Language: en, mi
服務(wù)端響應(yīng):
HTTP/1.1 200 OKDate: Mon, 27 Jul 2009 12:28:53 GMTServer: ApacheLast-Modified: Wed, 22 Jul 2009 19:15:56 GMTETag: "34aa387-d-1568eb00"Accept-Ranges: bytesContent-Length: 51Vary: Accept-EncodingContent-Type: text/plain
響應(yīng)內(nèi)容:
Hello World! My payload includes a trailing CRLF.
一個(gè)很好用看請(qǐng)求的網(wǎng)站 http://httpbin.org/get
通過(guò)這個(gè)網(wǎng)站可以更簡(jiǎn)單的查看請(qǐng)求的詳細(xì)信息。
可以通過(guò)Python代碼模擬各種請(qǐng)求參數(shù)和header,發(fā)送給這個(gè)網(wǎng)站,再來(lái)驗(yàn)證發(fā)送的是否正確。
5. 完整的網(wǎng)頁(yè)請(qǐng)求過(guò)程
注意你看到一個(gè)網(wǎng)頁(yè),通常是分多次請(qǐng)求的,一般的過(guò)程為:
- 先請(qǐng)求網(wǎng)頁(yè)文本,也就是HTML
- 根據(jù)HTML中的指定的地址,請(qǐng)求其他內(nèi)容,最常見(jiàn)的是:樣式表,JavaScript,圖片等
所以在chrome中可以看到很多個(gè)請(qǐng)求。如下圖所示:
- 每一行都是一個(gè)請(qǐng)求
- 瀏覽器先請(qǐng)求http://www.baidu.com獲得了HTML
- 然后發(fā)起了多個(gè)其他請(qǐng)求去獲取css, woff2, png等其他資源
這種特點(diǎn)給爬蟲(chóng)帶來(lái)困難:
- 我們用代碼發(fā)送請(qǐng)求,一行代碼只能發(fā)送一次請(qǐng)求,也就是獲得了最基本的HTML。
- 有的網(wǎng)站在第一次的HTML中沒(méi)有包含真實(shí)的數(shù)據(jù),真實(shí)的數(shù)據(jù)是通過(guò)后續(xù)請(qǐng)求獲得的,所以有時(shí)候你用代碼去請(qǐng)求發(fā)現(xiàn)獲得的網(wǎng)頁(yè)沒(méi)有內(nèi)容。
解決這個(gè)問(wèn)題辦法通常有兩個(gè):
- 分析各個(gè)請(qǐng)求,找到關(guān)鍵的后續(xù)請(qǐng)求,用代碼發(fā)送后續(xù)關(guān)鍵請(qǐng)求獲取數(shù)據(jù)。通常,我們沒(méi)必要像瀏覽器一樣發(fā)送所有后續(xù)請(qǐng)求,找到關(guān)鍵請(qǐng)求就夠了。
- 使用selenium等瀏覽器驅(qū)動(dòng),模擬真實(shí)的瀏覽器操作,發(fā)送后續(xù)所有請(qǐng)求。
6. 請(qǐng)求
1) 請(qǐng)求行
下面例子中的第一行就是請(qǐng)求行,它包含幾個(gè)關(guān)鍵信息:
- 請(qǐng)求方法:例子中是GET,表示你要干什么
- 請(qǐng)求的資源地址:例子中是 /hello.txt,結(jié)合下面的Host (http://ww.example.com)就可以拼接處完整的地址
- 使用的HTTP協(xié)議的版本號(hào)
HTTP協(xié)議有多個(gè)版本,現(xiàn)在主要用1.1,HTTP2也有一些應(yīng)用
GET /hello.txt HTTP/1.1User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3Host: www.example.comAccept-Language: en, mi
2) 請(qǐng)求方法
根據(jù) HTTP 標(biāo)準(zhǔn),HTTP 請(qǐng)求可以使用多種請(qǐng)求方法,這些方法表示這個(gè)請(qǐng)求要做什么。
HTTP1.0 定義了三種請(qǐng)求方法:GET, POST 和 HEAD方法。
HTTP1.1 新增了六種請(qǐng)求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
最常用的請(qǐng)求方法是:
- GET 請(qǐng)求表示要獲取內(nèi)容,它不會(huì)修改服務(wù)器上的數(shù)據(jù)
- POST 請(qǐng)求表示要提交內(nèi)容,通常會(huì)修改服務(wù)器上的內(nèi)容
這是最基本應(yīng)該掌握的兩個(gè)點(diǎn)。下面是完整的HTTP請(qǐng)求方法。
3) 請(qǐng)求參數(shù)
GET請(qǐng)求的參數(shù)
GET 請(qǐng)求的參數(shù)都是放在URL中的,網(wǎng)頁(yè)看見(jiàn):
請(qǐng)求參數(shù)是以鍵值對(duì)的形式出現(xiàn),一般形式為:
- 網(wǎng)址的后面緊跟著是一個(gè)問(wèn)號(hào)
- 問(wèn)號(hào)的后面是一對(duì)對(duì)參數(shù),形式為:參數(shù)1=參數(shù)1的值
- 多個(gè)參數(shù)之間用&符號(hào)隔開(kāi)
舉例:https://www.example.com/page1?參數(shù)1=參數(shù)1的值&參數(shù)2=參數(shù)2的值
看一下,上面的截圖中有哪些參數(shù),它們的值分別是什么?
POST請(qǐng)求的參數(shù)
- POST請(qǐng)求的參數(shù)放在請(qǐng)求體中
- 網(wǎng)頁(yè)上看不見(jiàn)
- 但可以通過(guò)chrome開(kāi)發(fā)者工具或者抓包工具看見(jiàn)
格式舉例:
GET /hello.txt HTTP/1.1User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3Host: www.example.comAccept-Language: en, mi{'name':'麥?zhǔn)?#39;, '特征':'帥','坐標(biāo)':'一個(gè)美麗的城市'}
4) 請(qǐng)求頭
這部分內(nèi)容非常重要,這是爬蟲(chóng)的關(guān)鍵技術(shù)之一,因?yàn)榉?wù)器通常通過(guò)請(qǐng)求頭來(lái):
- 判定請(qǐng)求是否合法,這是基本的反爬措施。爬蟲(chóng)通常需要添加多個(gè)請(qǐng)求頭來(lái)模擬真實(shí)的網(wǎng)頁(yè)請(qǐng)求
- 判斷用戶是否登陸了,一般通過(guò)Cookie這個(gè)特殊的請(qǐng)求頭的內(nèi)容來(lái)判定,只要我們給出合理的Cookie,服務(wù)器就認(rèn)為我們是登錄過(guò)了
下面是一個(gè)請(qǐng)求頭列表,其中最重要的幾個(gè)是:
- User-Agent 代表發(fā)起訪問(wèn)是什么瀏覽器。如果不寫,基本會(huì)被判定為爬蟲(chóng),直接被拒了。
- Cookie 里面記錄了登錄信息,或者上次請(qǐng)求服務(wù)端設(shè)置的信息,也是常用的反爬判定點(diǎn)
- Referer 表示這次請(qǐng)求是從哪里點(diǎn)過(guò)來(lái)的,有的網(wǎng)站不允許你直接訪問(wèn)某個(gè)網(wǎng)頁(yè),必須是從它的其他網(wǎng)頁(yè)點(diǎn)過(guò)來(lái)才行,這時(shí)候就要設(shè)置一個(gè)Referer值,模擬是從別的網(wǎng)頁(yè)點(diǎn)過(guò)來(lái)的情況
7. 響應(yīng)
1) 狀態(tài)碼
當(dāng)瀏覽者訪問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),瀏覽者的瀏覽器會(huì)向網(wǎng)頁(yè)所在服務(wù)器發(fā)出請(qǐng)求。當(dāng)瀏覽器接收并顯示網(wǎng)頁(yè)前,此網(wǎng)頁(yè)所在的服務(wù)器會(huì)返回一個(gè)包含HTTP狀態(tài)碼的信息頭(server header)用以響應(yīng)瀏覽器的請(qǐng)求。
HTTP狀態(tài)碼的英文為HTTP Status Code。
下面是常見(jiàn)的HTTP狀態(tài)碼:
- 200 - 請(qǐng)求成功
- 301 - 資源(網(wǎng)頁(yè)等)被永久轉(zhuǎn)移到其它URL
- 404 - 請(qǐng)求的資源(網(wǎng)頁(yè)等)不存在
- 500 - 內(nèi)部服務(wù)器錯(cuò)誤
HTTP狀態(tài)碼由三個(gè)數(shù)字組成,第一個(gè)數(shù)字定義了狀態(tài)碼的類型,后兩個(gè)數(shù)字表示具體的狀態(tài)。HTTP狀態(tài)碼共分為5種類型:
HTTP狀態(tài)碼列表:
2) 響應(yīng)頭
HTTP響應(yīng)頭包含了網(wǎng)頁(yè)的重要描述信息,比如網(wǎng)頁(yè)的格式,網(wǎng)頁(yè)的過(guò)期時(shí)間等。
注意下面的
Set-Cookie,它會(huì)設(shè)置網(wǎng)頁(yè)的Cookie,在后面的請(qǐng)求中發(fā)送給服務(wù)器端,用來(lái)做身份判定或者反爬。
3) 響應(yīng)內(nèi)容和content type
我們最常見(jiàn)的網(wǎng)頁(yè)的內(nèi)容格式為:
- HTML - 給人看的頁(yè)面
- JSON - 數(shù)據(jù)格式,一般是API,給程序用的,比如手機(jī)APP
- XML - 也是數(shù)據(jù)格式
其實(shí)除此之外,還有圖片,樣式表,JavaScript等。
Content-Type就表示了網(wǎng)頁(yè)的內(nèi)容類型,它告訴瀏覽器文件類型,網(wǎng)頁(yè)編碼,幫助瀏覽器決定將以什么形式、什么編碼讀取這個(gè)文件。
Content-Type 標(biāo)頭告訴客戶端實(shí)際返回的內(nèi)容的內(nèi)容類型。
語(yǔ)法格式:
Content-Type: text/html; charset=utf-8Content-Type: multipart/form-data; boundary=something
實(shí)例:
常見(jiàn)的媒體格式類型如下:
- text/html :HTML格式
- text/plain :純文本格式
- text/xml :XML格式
- image/gif :gif圖片格式
- image/jpeg :jpg圖片格式
- image/png:png圖片格式
以application開(kāi)頭的媒體格式類型:
- application/xhtml+xml :XHTML格式
- application/xml:XML數(shù)據(jù)格式
- application/atom+xml :Atom XML聚合格式
- application/json:JSON數(shù)據(jù)格式
- application/pdf:pdf格式
- application/msword :Word文檔格式
- application/octet-stream :二進(jìn)制流數(shù)據(jù)(如常見(jiàn)的文件下載)
- application/x-www-form-urlencoded :中默認(rèn)的encType,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認(rèn)的提交數(shù)據(jù)的格式)
另外一種常見(jiàn)的媒體格式是上傳文件之時(shí)使用的:
- multipart/form-data :需要在表單中進(jìn)行文件上傳時(shí),就需要使用該格式
看視頻
配套視頻在B站,搜索
“麥?zhǔn)寰幊獭保?/b>不要吝嗇你的三連。
我是麥?zhǔn)?,帶你學(xué)編程,陪你走職場(chǎng)的路。
關(guān)鍵詞:爬蟲(chóng),協(xié)議,文章,入門