最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲入門教程--快速理解HTTP協(xié)議(一)

 更新時間:2017年05月25日 09:15:32   作者:FOOFISH  
http協(xié)議是互聯(lián)網(wǎng)里面最重要,最基礎(chǔ)的協(xié)議之一,我們的爬蟲需要經(jīng)常和http協(xié)議打交道。下面這篇文章主要給大家介紹了關(guān)于python爬蟲入門之快速理解HTTP協(xié)議的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。

前言

爬蟲的基本原理是模擬瀏覽器進(jìn)行 HTTP 請求,理解 HTTP 協(xié)議是寫爬蟲的必備基礎(chǔ),招聘網(wǎng)站的爬蟲崗位也赫然寫著熟練掌握HTTP協(xié)議規(guī)范,寫爬蟲還不得不先從HTTP協(xié)議開始講起

HTTP協(xié)議是什么?

你瀏覽的每一個網(wǎng)頁都是基于 HTTP 協(xié)議呈現(xiàn)的,HTTP 協(xié)議是互聯(lián)網(wǎng)應(yīng)用中,客戶端(瀏覽器)與服務(wù)器之間進(jìn)行數(shù)據(jù)通信的一種協(xié)議。協(xié)議中規(guī)定了客戶端應(yīng)該按照什么格式給服務(wù)器發(fā)送請求,同時也約定了服務(wù)端返回的響應(yīng)結(jié)果應(yīng)該是什么格式。

只要大家都按照協(xié)議規(guī)定方式發(fā)起請求和返回響應(yīng)結(jié)果,任何人都可以基于HTTP協(xié)議實(shí)現(xiàn)自己的Web客戶端(瀏覽器、爬蟲)和Web服務(wù)器(Nginx、Apache等)。

HTTP 協(xié)議本身是非常簡單的。它規(guī)定,只能由客戶端主動發(fā)起請求,服務(wù)器接收請求處理后返回響應(yīng)結(jié)果,同時 HTTP 是一種無狀態(tài)的協(xié)議,協(xié)議本身不記錄客戶端的歷史請求記錄。

HTTP 協(xié)議是如何規(guī)定請求格式和響應(yīng)格式的呢?換言之,客戶端按照什么格式才能正確發(fā)起 HTTP 請求呢?服務(wù)端按照什么格式返回響應(yīng)結(jié)果客戶端才能正確解析?

HTTP 請求

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

請求行

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

HTTP協(xié)議中最常用的請求方法有:GET、POST、PUT、DELETE。GET 方法用于從服務(wù)器獲取資源,90%的爬蟲都是基于GET請求抓取數(shù)據(jù)。

請求 URL 是指資源所在服務(wù)器的路徑地址,比如上圖的例子表示客戶端想獲取 index.html 這個資源,它的路徑在服務(wù)器 foofish.net 的根目錄(/)下面。

請求首部

因?yàn)檎埱笮兴鶖y帶的信息量非常有限,以至于客戶端還有很多想向服務(wù)器要說的事情不得不放在請求首部(Header),請求首部用于給服務(wù)器提供一些額外的信息,比如 User-Agent 用來表明客戶端的身份,讓服務(wù)器知道你是來自瀏覽器的請求還是爬蟲,是來自 Chrome 瀏覽器還是 FireFox。HTTP/1.1 規(guī)定了47種首部字段類型。HTTP首部字段的格式很像 Python 中的字典類型,由鍵值對組成,中間用冒號隔開。比如:

User-Agent: Mozilla/5.0

因?yàn)榭蛻舳税l(fā)送請求時,發(fā)送的數(shù)據(jù)(報文)是由字符串構(gòu)成的,為了區(qū)分請求首部的結(jié)尾和請求體的開始,用一個空行來表示,遇到空行時,就表示這是首部的結(jié)尾,請求體的開始。

請求體

請求體是客戶端提交給服務(wù)器的真正內(nèi)容,比如用戶登錄時的需要用的用戶名和密碼,比如文件上傳的數(shù)據(jù),比如注冊用戶信息時提交的表單信息。

現(xiàn)在我們用 Python 提供的最原始API socket 模塊來模擬向服務(wù)器發(fā)起一個 HTTP 請求

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
 # 1. 與服務(wù)器建立連接
 s.connect(("www.seriot.ch", 80))
 # 2. 構(gòu)建請求行,請求資源是 index.php
 request_line = b"GET /index.php HTTP/1.1"
 # 3. 構(gòu)建請求首部,指定主機(jī)名
 headers = b"Host: seriot.ch"
 # 4. 用空行標(biāo)記請求首部的結(jié)束位置
 blank_line = b"\r\n"

 # 請求行、首部、空行這3部分內(nèi)容用換行符分隔,組成一個請求報文字符串
 # 發(fā)送給服務(wù)器
 message = b"\r\n".join([request_line, headers, blank_line])
 s.send(message)

 # 服務(wù)器返回的響應(yīng)內(nèi)容稍后進(jìn)行分析
 response = s.recv(1024)
 print(response)

HTTP 響應(yīng)

服務(wù)端接收請求并處理后,返回響應(yīng)內(nèi)容給客戶端,同樣地,響應(yīng)內(nèi)容也必須遵循固定的格式瀏覽器才能正確解析。HTTP 響應(yīng)也由3部分組成,分別是:響應(yīng)行、響應(yīng)首部、響應(yīng)體,與 HTTP 的請求格式是相對應(yīng)的。

響應(yīng)行

響應(yīng)行同樣也是3部分組成,由服務(wù)端支持的 HTTP 協(xié)議版本號、狀態(tài)碼、以及對狀態(tài)碼的簡短原因描述組成。

狀態(tài)碼是響應(yīng)行中很重要的一個字段。通過狀態(tài)碼,客戶端可以知道服務(wù)器是否正常處理的請求。如果狀態(tài)碼是200,說明客戶端的請求處理成功,如果是500,說明服務(wù)器處理請求的時候出現(xiàn)了異常。404 表示請求的資源在服務(wù)器找不到。除此之外,HTTP 協(xié)議還很定義了很多其他的狀態(tài)碼,不過它不是本文的討論范圍。

響應(yīng)首部

響應(yīng)首部和請求首部類似,用于對響應(yīng)內(nèi)容的補(bǔ)充,在首部里面可以告知客戶端響應(yīng)體的數(shù)據(jù)類型是什么?響應(yīng)內(nèi)容返回的時間是什么時候,響應(yīng)體是否壓縮了,響應(yīng)體最后一次修改的時間。

響應(yīng)體

響應(yīng)體(body)是服務(wù)器返回的真正內(nèi)容,它可以是一個HTML頁面,或者是一張圖片、一段視頻等等。

我們繼續(xù)沿用前面那個例子來看看服務(wù)器返回的響應(yīng)結(jié)果是什么?因?yàn)槲抑唤邮樟饲?024個字節(jié),所以有一部分響應(yīng)內(nèi)容是看不到的。

b'HTTP/1.1 200 OK\r\n
Date: Tue, 04 Apr 2017 16:22:35 GMT\r\n
Server: Apache\r\n
Expires: Thu, 19 Nov 1981 08:52:00 GMT\r\n
Set-Cookie: PHPSESSID=66bea0a1f7cb572584745f9ce6984b7e; path=/\r\n
Transfer-Encoding: chunked\r\n
Content-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>

從結(jié)果來看,它與協(xié)議中規(guī)范的格式是一樣的,第一行是響應(yīng)行,狀態(tài)碼是200,表明請求成功。第二部分是響應(yīng)首部信息,由多個首部組成,有服務(wù)器返回響應(yīng)的時間,Cookie信息等等。第三部分就是真正的響應(yīng)體 HTML 文本。

至此,你應(yīng)該對 HTTP 協(xié)議有一個總體的認(rèn)識了,爬蟲的行為本質(zhì)上就是模擬瀏覽器發(fā)送HTTP請求,所以要想在爬蟲領(lǐng)域深耕細(xì)作,理解 HTTP 協(xié)議是必須的。

總結(jié)

以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Python中Cryptography庫實(shí)現(xiàn)加密解密

    Python中Cryptography庫實(shí)現(xiàn)加密解密

    Python中Cryptography庫給你的文件加把安全鎖,本文主要介紹了Python中Cryptography庫實(shí)現(xiàn)加密解密,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • python去除空格,tab制表符和\n換行符的小技巧分享

    python去除空格,tab制表符和\n換行符的小技巧分享

    這篇文章主要介紹了python去除空格,tab制表符和\n換行符的小技巧,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python3+selenium配置常見報錯解決方案

    Python3+selenium配置常見報錯解決方案

    這篇文章主要介紹了Python3+selenium配置常見報錯解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Python 2種方法求某個范圍內(nèi)的所有素數(shù)(質(zhì)數(shù))

    Python 2種方法求某個范圍內(nèi)的所有素數(shù)(質(zhì)數(shù))

    這篇文章主要介紹了Python 2種方法求某個范圍內(nèi)的所有素數(shù)(質(zhì)數(shù)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python?Logistic邏輯回歸算法使用詳解

    Python?Logistic邏輯回歸算法使用詳解

    這篇文章主要介紹了Python?Logistic邏輯回歸算法使用的方法和原理,Logistic雖然不是十大經(jīng)典算法之一,但卻是數(shù)據(jù)挖掘中常用的有力算法,所以這里也專門進(jìn)行了學(xué)習(xí),需要的朋友可以參考下
    2021-06-06
  • Pycharm社區(qū)版創(chuàng)建Flask項(xiàng)目的實(shí)現(xiàn)步驟

    Pycharm社區(qū)版創(chuàng)建Flask項(xiàng)目的實(shí)現(xiàn)步驟

    本文主要介紹了Pycharm社區(qū)版創(chuàng)建Flask項(xiàng)目,包括設(shè)置Python環(huán)境、安裝Flask庫以及創(chuàng)建基本的項(xiàng)目結(jié)構(gòu),具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Python中eval()函數(shù)的功能及使用方法小結(jié)

    Python中eval()函數(shù)的功能及使用方法小結(jié)

    python中eval(str)函數(shù)很強(qiáng)大,官方解釋為:將字符串str當(dāng)成有效的表達(dá)式來求值并返回計算結(jié)果,所以,結(jié)合math當(dāng)成一個計算器很好用
    2023-05-05
  • 爬蟲小技巧利用Mitmproxy破解app

    爬蟲小技巧利用Mitmproxy破解app

    不同于Fiddler或Wireshark等抓包工具,mitmproxy不僅可以截獲請求幫助開發(fā)者查看、分析,還可以通過自定義腳本進(jìn)行二次開發(fā)
    2021-09-09
  • 最新python 字符串?dāng)?shù)組互轉(zhuǎn)問題

    最新python 字符串?dāng)?shù)組互轉(zhuǎn)問題

    這篇文章主要介紹了最新python 字符串?dāng)?shù)組互轉(zhuǎn)問題,主要介紹了字符串轉(zhuǎn)list數(shù)組問題和list數(shù)組轉(zhuǎn)字符串問題,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • pandas 對日期類型數(shù)據(jù)的處理方法詳解

    pandas 對日期類型數(shù)據(jù)的處理方法詳解

    這篇文章主要介紹了pandas 對日期類型數(shù)據(jù)的處理方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論

青州市| 即墨市| 沙坪坝区| 怀化市| 皮山县| 同心县| 光山县| 孝义市| 黄山市| 新闻| 延长县| 胶南市| 岳普湖县| 明溪县| 南阳市| 镇远县| 武山县| 廉江市| 婺源县| 泗洪县| 开封市| 西华县| 武宁县| 洛川县| 德钦县| 达州市| 辽源市| 沁水县| 普宁市| 舒城县| 琼结县| 塘沽区| 中牟县| 汝阳县| 探索| 五河县| 辽阳县| 成都市| 鸡泽县| 鄄城县| 汉寿县|