中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解讀爬蟲中HTTP的基礎知識

發布時間:2022-01-12 17:03:53 來源:億速云 閱讀:162 作者:柒染 欄目:服務器

這篇文章將為大家詳細講解有關如何解讀爬蟲中HTTP的基礎知識,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

什么是HTTP?

<HTTP的介紹>

引自百度百科的權威回答:

超文本傳輸協議(HTTP,HyperText Transfer Protocol) 是互聯網上應用最為廣泛的一種網絡協議。所有WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。

1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標準架構的發展根基。Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。

HTTP協議是用于從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先于圖形)等。

<HTTP的模型>

HTTP采用了瀏覽器/服務器這種請求/響應模型,瀏覽器永遠是HTTP請求的發起者,服務器為響應者。

如何解讀爬蟲中HTTP的基礎知識

這樣在瀏覽器客戶端沒有發起請求的情況下,服務器是不能主動推送消息給客戶端的。

<HTTP的定位>

HTTP是一個應用層協議,是我們想從服務器端獲取信息的最直觀的請求。比如,在爬蟲中使用的<urllib模塊>,<requests模塊>等都是封裝了HTTP協議,作為一個HTTP客戶端實現了博文,圖片,視頻等信息源的下載。

但是HTTP也不是直接就可以用的,它的請求是建立在一些底層協議的基礎上完成的。如TCP/IP協議棧中,HTTP需要TCP的三次握手連接成功后才能向服務器發起請求。當然,如果是HTTPS的話,還需要TSL和SSL安全層。

如何解讀爬蟲中HTTP的基礎知識

一個完整的HTTP請求過程

既然HTTP協議需要建立在其它底層協議基礎上,我們來看看一個完整的HTTP請求是什么樣的。

當我們點擊一個鏈接或者輸入一個鏈接的時候,整個HTTP的請求過程就開始了,然后經過以下步驟得到***的信息,我們這里簡單介紹一下前四個步驟,旨在了解HTTP。

如何解讀爬蟲中HTTP的基礎知識

<1> 域名解析

首先會搜索各種本地DNS緩存,如果沒有就會向DNS服務器(互聯網提供商)發起域名解析,以獲取IP地址。

<2> 建立TCP連接

當獲取IP后,將創建套接字socket連接,也就是TCP的3次握手連接,默認端口號80。

<3> HTTP請求

一旦TCP連接成功后,瀏覽器/爬蟲就可以向服務器發起HTTP請求報文了,報文內容包含請求行、請求頭部、請求主體。

<4> 服務器響應

服務器響應,并返回一個HTTP響應包(如果成功會返回狀態碼200)和請求的HTML代碼。

上面的步驟<3>和<4>可以簡單的示意如下,更方便大家理解。其中,請求和響應都包含特定格式的信息,具體我們接下來會繼續解讀。

如何解讀爬蟲中HTTP的基礎知識

響應HTTP請求會返回響應狀態碼,根據狀態碼可以知道返回信息的狀態。狀態碼規定如下:

1xx: 信息響應類,表示接收到請求并且繼續處理

    100&mdash;&mdash;必須繼續發出請求

    101&mdash;&mdash;要求服務器根據請求轉換HTTP協議版本

2xx: 處理成功響應類,表示動作被成功接收、理解和接受

200&mdash;&mdash;交易成功

201&mdash;&mdash;提示知道新文件的URL

202&mdash;&mdash;接受和處理、但處理未完成

203&mdash;&mdash;返回信息不確定或不完整

204&mdash;&mdash;請求收到,但返回信息為空

205&mdash;&mdash;服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件

206&mdash;&mdash;服務器已經完成了部分用戶的GET請求

3xx: 重定向響應類,為了完成指定的動作,必須接受進一步處理

300&mdash;&mdash;請求的資源可在多處得到

301&mdash;&mdash;刪除請求數據

302&mdash;&mdash;在其他地址發現了請求數據

303&mdash;&mdash;建議客戶訪問其他URL或訪問方式

304&mdash;&mdash;客戶端已經執行了GET,但文件未變化

305&mdash;&mdash;請求的資源必須從服務器指定的地址得到

306&mdash;&mdash;前一版本HTTP中使用的代碼,現行版本中不再使用

307&mdash;&mdash;申明請求的資源臨時性刪除

4xx: 客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行

400&mdash;&mdash;錯誤請求,如語法錯誤

401&mdash;&mdash;未授權

402&mdash;&mdash;保留有效ChargeTo頭響應

403&mdash;&mdash;禁止訪問

404&mdash;&mdash;沒有發現文件、查詢或URl

405&mdash;&mdash;在Request-Line字段定義的方法不允許

406&mdash;&mdash;根據發送的Accept,請求資源不可訪問

407&mdash;&mdash;用戶必須首先在代理服務器上得到授權

408&mdash;&mdash;客戶端沒有在指定的時間內完成請求

409&mdash;&mdash;對當前資源狀態,請求不能完成

410&mdash;&mdash;服務器不再有此資源且無進一步地址

411&mdash;&mdash;服務器拒絕用戶定義的Content-Length

412&mdash;&mdash;一個或多個請求頭字段在當前請求中錯誤

413&mdash;&mdash;請求的資源大于服務器允許的大小

414&mdash;&mdash;請求的資源URL長于服務器允許的長度

415&mdash;&mdash;請求資源不支持請求項目格式

416&mdash;&mdash;請求中包含Range請求頭字段,在當前請求資源范圍內沒有range指示值,請求也不包含If-Range請求頭字段

417&mdash;&mdash;服務器不滿足請求Expect頭字段指定的期望值,如果是代理服務器,可能是下一級服務器不能滿足請求長。

5xx: 服務端錯誤,服務器不能正確執行一個正確的請求

500&mdash;&mdash;內部服務器錯誤

501&mdash;&mdash;未實現

502&mdash;&mdash;網關錯誤

HTTP請求報文

相信你已經對HTTP的請求過程有了大致的了解了,下面我們來詳細介紹HTTP請求的報文信息。

報文內容包含請求行、請求頭部、請求主體。

如何解讀爬蟲中HTTP的基礎知識

下面我們來看一下通過開發者工具請求<https://www.baidu.com/>網址截取下來的HTTP請求報文內容,對比一下上面的標準格式。

如何解讀爬蟲中HTTP的基礎知識

我們發現請求報文的格式與上面基本一致,正式我們想要的。那么,接下來我們將要逐個的介紹以上各個信息。

請求行

<GET>是HTTP的請求方式之一,HTTP/1.1協議中共定義了8種方法與服務器交互,有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,其中比較常用的是<GET>和<POST>方法了。

HEAD: 從服務器得到除了請求體與GET請求一樣的響應

GET:通過URL獲取查詢資源信息(爬蟲特定URL爬取)

POST:提交表單(爬蟲中的模擬登錄)

PUT:上傳文件(瀏覽器不支持)

DELETE:刪除

OPTIONS:返回服務器對特定資源支持的HTTP請求方法

TRACE:返回服務器收到的請求,用于測試或診斷

CONNECT:預留給管道連接方式的代理服務

GET請求方法后URL(這里是/)和版本1.1,別忘了空格。

請求頭

HTTP的頭域包括通用頭、請求頭、響應頭和實體頭四部分。因為在爬蟲過程中,我們經常會提交headers請求頭信息用于偽裝,所以我們這里對請求頭著重講解一下。

請求頭是請求報文特有的,它向服務器提交了一些額外的信息,例如通過Accept字段信息,我們客戶端可以告訴服務器我們接受一些什么類型的數據。而我們其實可以把這些字段信息就當成<鍵值對>對待。

下面我們看看這些字段都代表了什么意思?

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

含義:告訴瀏覽器我們接受MIME的類型

Accept-Encoding:gzip, deflate, br

含義:如果有這個字段,則代表客戶端支持壓縮將內容編碼,去掉后會支持任意編碼。

注意:爬蟲時一般不要把它加上,博主最開始就是不懂全都復制過來,結果因為這個就是不好使卡住好長時間。

Accept-Lanague:zh-CN,zh;q=0.9

含義:告訴服務器能夠接受的語言,沒有則代表任何語言

Connection:keep-alive

含義:告訴服務器需要持久有效的連接狀態(HTTP1.1默認會進行持久連接)

Host:www.baidu.com

含義:客戶端指定自己想訪問的web服務器域名/IP地址和端口號

Cache-control:max-age=0

含義:(引自百度百科)

Cache-Control 是最重要的規則。這個字段用于指定所有緩存機制在整個請求/響應鏈中必須服從的指令。這些指令指定用于阻止緩存對請求或響應造成不利干擾的行為。這些指令通常覆蓋默認緩存算法。緩存指令是單向的,即請求中存在一個指令并不意味著響應中將存在同一個指令。

網頁的緩存是由HTTP消息頭中的“Cache-control”來控制的,常見的取值有private、no-cache、max-age、must-revalidate等,默認為private。

但是HTTP請求和響應的Cache-Control是不完全一樣的。

常見的請求Cache-Control取值有<no-cache>, <no-store>, <max-age>, <max-stale>, <min-fresh>, <only-if-cached>。

響應的Cache-Control取值有<public>, <private>,  <no-cache>, <no- store>, <no-transform>, <must-revalidate>, <proxy-revalidate>, <max-age>。

我們這里主要介紹請求時的常見Cache-Control取值。

<1>max-age<=0

本例中使用max-age=0,表示每次請求會訪問服務器,通過Last-Modified來判斷文件是否被修改,如果被修改,返回狀態碼200并得到***文件,否則將返回304狀態碼并讀取緩存文件。

<2>max-age>0

表示會直接從瀏覽器提取緩存。

<3>no-cache

表示不會在瀏覽器緩存進行提取,而是強制的向服務器發出請求,這樣可以保證客戶端能夠收到最權威的回應。

<4>no-store

所有內容都不會被緩存到緩存或Internet臨時文件中。

Upgrade-Insecure-Requests:1

含義:表示瀏覽器/爬蟲可以處理HTTPS協議,并能自動升級請求從HTTP到HTTPS。

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) ..Safari/537.36

含義:(這個是爬蟲中最常用了)用于偽裝成瀏覽器身份請求網頁。它的意思自然就是表示瀏覽器的身份,說明是用的哪種瀏覽器進行的操作。

Cookies:

含義:(這個也是爬蟲中很重要的了,通常用于模擬登錄)

Cookies是用于維持服務端的會話狀態,由服務器端寫入,然后在后續請求中,供服務器讀取使用。

以上就是本例中出現的所有字段信息內容。當然,還有其它一些常用字段信息,這里也一起說明一下。

其它請求頭字段信息

Referer:

含義:(這個也是爬蟲常用到的,防盜鏈)

客戶端通過當前URL代表的頁面出發訪問我們請求的頁面。爬蟲中,一般我們只要把它設置成請求的網頁鏈接就好了。

Accept-Charset:

含義:(這個也是爬蟲常用到的)

表示瀏覽器可接受的字符集,可以是utf-8,gbk等

If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT

含義:請求的內容在指定日期以后一旦被修改就被返回對象內容,否則返回“Not Modified”

Pragma:

含義:

Pragma頭域用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。

Range:

含義:告訴瀏覽器自己想取對象的哪個部分。例如,Range: bytes=1173546

關于如何解讀爬蟲中HTTP的基礎知識就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

壶关县| 应城市| 定远县| 苏州市| 江北区| 麻城市| 上杭县| 宝丰县| 南京市| 竹北市| 兴仁县| 涟水县| 宾川县| 青阳县| 镇原县| 孙吴县| 汕尾市| 托里县| 肥西县| 永寿县| 阿克苏市| 当涂县| 玉林市| 娱乐| 交口县| 内乡县| 四川省| 思南县| 亚东县| 盐边县| 浠水县| 宁海县| 历史| 炉霍县| 涪陵区| 齐齐哈尔市| 鄱阳县| 顺平县| 兴义市| 虹口区| 哈密市|