国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 17:13:43
字體:
來源:轉載
供稿:網友

前言

python/266511.html">爬蟲的基本原理是模擬瀏覽器進行 HTTP 請求,理解 HTTP 協議是寫爬蟲的必備基礎,招聘網站的爬蟲崗位也赫然寫著熟練掌握HTTP協議規范,寫爬蟲還不得不先從HTTP協議開始講起

HTTP協議是什么?

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

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

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

python,實現http協議,爬蟲,http協議

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

HTTP 請求

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

python,實現http協議,爬蟲,http協議

請求行

請求行是每個請求必不可少的部分,它由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 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 的請求格式是相對應的。

python,實現http協議,爬蟲,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 協議是必須的。

總結

以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐业县| 松桃| 拜泉县| 东山县| 神池县| 华安县| 白河县| 黄骅市| 东明县| 建宁县| 南平市| 虹口区| 松阳县| 合肥市| 称多县| 噶尔县| 濮阳县| 延吉市| 元朗区| 无极县| 石楼县| 合川市| 泰州市| 福清市| 玛沁县| 平乐县| 奇台县| 娄烦县| 霍林郭勒市| 玛纳斯县| 太仆寺旗| 静海县| 彰化县| 高陵县| 宜黄县| 资兴市| 资源县| 谷城县| 郧西县| 龙门县| 眉山市|