HTTP協議(Hypertext transfer protocol超文本傳輸協議)
1、預備知識:
一、HTTP協議是應用層協議,定義的是傳輸數據的內容的規範。HTTP是一個客戶端終端(用戶)和服務器端(網站)請求和應答標準。經過使用網頁瀏覽器、網絡爬蟲或者其餘工具,客戶端發起一個HTTP 請到服務器上的指定端口(默認80)。服務器上存儲着一些資源,如HTML文件和圖像等html
二、HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議python
三、HTTP默認的端口號爲80,HTTPS的端口號爲443web
四、HTTP協議是一種詳細規定了瀏覽器和萬維網(WWW = World Wide Web)服務器之間互相通訊的規則,經過因特網傳送萬維網文檔的數據傳送協議ajax
五、URL(Uniform Resource Locator-統一資源定位符),URL是萬維網(WWW)上的每一信息資源對應的統一的且在網上惟一的地址。URL4部分組成:協議、主機、端口(省略時使用方案的默認端口)、路徑。URL格式:protocol :// hostname[:port] / path / [;parameters][?query]#fragment瀏覽器
六、URL中#號(井號)的做用是頁面定位符。由於#是用來指導瀏覽器動做的,對服務器端徹底無用,因此HTTP請求不包括#。URL中&號,不一樣參數的間隔符。URL中?號,鏈接做用和清除緩存做用。URL轉碼!緩存
七、MIME(Multipurpose Internet Mail Extensions-多用途互聯網郵件擴展類型)信息:MIME在 RFC 822(RFC 822所制定的標準,電子郵件通常只用來傳遞基本的ASCII碼文本信息)的基礎上對電子郵件規範作了大量的擴展,引入了新的格式規範和編碼方式。在MIME的支持下,圖像、聲音、動畫等二進制文件均可方便的經過電子郵件來進行傳遞,極大地豐富了電子郵件的功能,彌補了原來信息格式的不足。MIME消息由消息頭和消息體兩大部分組成安全
八、表單基本上能夠當作一種用戶提交 post 請求的方式。大多數網頁表單組成部分:HTML字段、一個提交按鈕、一個進行表單處理的操做頁面服務器
關注的問題:一、提交數據的字段的名稱要一致,尋找 name 屬性獲取如:name="LoginName"、name="Password"等,;2、表單的 action 屬性,也就是表單提交後顯示的頁面cookie
技巧:使用瀏覽器的檢查器獲取:form data 中的字段網絡
一、博客園登陸表單頁面源代碼
<form id="loginForm" method="post" onsubmit="return false" action="/signin?returnurl=https%3A%2F%2Fwww.cnblogs.com%2F"> <div class="form-group"> <input tabindex="1" class="form-control" placeholder="登陸用戶名 / 郵箱" autofocus type="text" data-val="true" data-val-required="請輸入登陸用戶名" id="LoginName" name="LoginName" value=""> <span class="invalid-feedback field-validation-valid" data-valmsg-for="LoginName" data-valmsg-replace="true"></span> <a href="//passport.cnblogs.com/GetUsername.aspx" class="txt-forget-sign">忘記登陸用戶名</a> </div> <div class="form-group"> <input tabindex="2" class="form-control" placeholder="密碼" type="password" data-val="true" data-val-required="請輸入密碼" id="Password" name="Password"> <span class="invalid-feedback field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> <a class="txt-forget-sign" href="/resetpassword">忘記密碼</a> </div> <div class="form-remember custom-control custom-checkbox"> <input tabindex="3" type="checkbox" id="IsRemember" name="IsRemember" value="true" class="custom-control-input"> <label class="custom-control-label" for="IsRemember">記住我</label> </div> <button tabindex="4" id="submitBtn" type="submit" class="btn-login btn btn-primary btn-sm ladda-button px-4" data-style="slide-down"> <span class="ladda-label">登陸</span> </button> <div class="login-footer"> <div class="ajax-error-box"> <div class="ajax-error mb-2"></div> </div> <span>沒有帳戶,<a href="/signup">當即註冊</a></span> </div> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8Nf-Z6tqUPlNrwu2nvfTJEh-rurpDGemYDyHEQVG17iXEcv4QH-0AKBpjGNBSoRWbHejE3hyx2HEzXYUc-WpZYp8RE6Feb3zF4fILWL2omfCW9DlItvVpp8caQnWc9LeYzNbNQxVD2BR2ojfPhVqX5s" /></form>
二、提交表單示例
import requests params = {'email_addr': 'ryan.e.mitchell@gmail.com'} r = requests.post("http://post.oreilly.com/client/o/oreilly/forms/quicksignup.cgi", data=params) print(r.text)
2、實現過程:
一、客戶端和服務器創建TCP鏈接
二、客戶端向服務器發送請求報文,請求報文包含請求行,請求頭部,空行和請求數據
三、服務且接收請求報文,根據請求報文的請求行裏包含的資源,定位請求資源 ,服務器將該資複寫到TCP套接字,由客戶端讀取。響應包含狀態行,響應頭部,空行和響應數據
四、根據 connection 模式,若是爲close,關閉TCP鏈接;若是爲 keepalive,鏈接會保持一段時間,在該時間內能夠繼續接收請求
五、客戶端解析響應報文中的狀態行->響應頭部的信息->處理響應數據並在瀏覽器窗口顯示
3、實現細節:
一、HTTP請求方法
根據HTTP標準,HTTP請求可使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
二、POST 請求:請求行、請求頭部、空行、請求數據。
一、請求行:請求類型(POST)+資源+協議版本號(HTTP1.1);
二、請求頭部:服務器要使用的附加信息如:HOST、User-Agent(客戶端稱爲用戶代理程序)、Accept 指定客戶端可以接受的內容格式類型、
Accept-Language 指定客戶端可以接受的內容格式類型、Accept-Encoding 指定客戶端可以接受的編碼類型。
三、空行:請求頭部後面的空行是必須的
四、請求數據:主體(能夠添加任意的其餘數據)
示例1-請求信息
三、GET和POST的區別:
一、GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
二、GET提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
三、GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值。
四、GET方式提交數據,會帶來安全問題,好比一個登陸頁面,經過GET方式提交數據時,用戶名和密碼將出如今URL上,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器,就能夠從歷史記錄得到該用戶的帳號和密碼.
四、響應信息:狀態行、消息報頭、空行、響應正文
一、狀態行:HTTP協議版本號+狀態碼+狀態消息;
二、消息報頭:客戶端要使用的一些附加信息,如Server(服務器軟件名如:Apache/Nginx)、Date,Content-Type:指定了MIME類型的HTML,編碼類型是ISO-8859-一、Lsat-Modified等。
三、空行:消息報頭後面的空行是必須的!
四、響應正文:服務器返回給客戶端的文本信息
示例2-響應信息
注:狀態碼 圖-1-狀態碼及其含義
3、HTTP頭部部信息
一、通用頭(General)
二、響應頭(Response Header)
-
cache-control:no-cache
-
content-encoding:gzip
-
content-language:en-US
-
content-type:text/html;charset=utf-8
-
date:Sat, 11 Jan 2020 07:41:45 GMT
-
process-stage:Stage-Outbound
-
server:Tengine
-
set-cookie:__zp_sseed__=naTK2v0v7/16NdZt2T+VM2e4GskS/ZDyvNZlKmyz0TY=; Path=/; Domain=.zhipin.com
-
set-cookie:__zp_sname__=a18c7908; Path=/; Domain=.zhipin.com
-
set-cookie:__zp_sts__=1578728505736; Path=/; Domain=.zhipin.com
-
status:200
三、請求頭(Request Header)
-
:authority:www.zhipin.com
-
:method:GET
-
:path:/job_detail/?query=%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88&city=101280100&industry=&position=
-
:scheme:https
-
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
-
accept-encoding:gzip, deflate, br
-
accept-language:en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
-
cache-control:max-age=0
-
cookie:_uab_collina=157839195682362008377006; _bl_uid=FOk4p5v15Uz2I466zndv7hkkXe71; t=jPRTkZWk0hqR0iZh; wt=jPRTkZWk0hqR0iZh; lastCity=101280100; __c=1578727706; __g=-; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1578496882,1578556577,1578583169,1578727707; __l=l=%2Fwww.zhipin.com%2Fguangzhou%2F&r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DkinULdZ6qg0b4I_JkQ3iKvEE0gVm14oE9svztCE2QBXLy42-gdFuUWuZkAwRmi1O%26wd%3D%26eqid%3D8bafd4e2001c5d7b000000065e196835&friend_source=0&friend_source=0; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1578728491; __a=39430272.1578391954.1578583131.1578727706.76.6.7.51; __zp_stoken__=babb4xsJouAUw5dJKFTemUGwm7GaZ4GiZsxsYfi0boHHtTaiz1zn3SokIlsLV26OzCc0nZKxZtDWyANLfyQAtysbT%2BBySrxBj5uJz7YIxUCIWmant%2BtlUXZcVVR%2ByTZu2fVx
-
referer:https://www.zhipin.com/web/common/security-check.html?seed=naTK2v0v7%2F16NdZt2T%2BVM6jCGuuZVPQCy4pGXJMOIHU%3D&name=a18c7908&ts=1578728316222&callbackUrl=%2Fjob_detail%2F%3Fquery%3D%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE%25E5%25BC%2580%25E5%258F%2591%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588%26city%3D101280100%26industry%3D%26position%3D&srcReferer=https%3A%2F%2Fwww.zhipin.com%2Fguangzhou%2F
-
upgrade-insecure-requests:1
-
user-agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.18 Safari/537.36
4、請求頭(Request Header)中的 referer
詳情見:https://www.cnblogs.com/yinminbo/p/12180272.html
5、 url轉碼
符號 |
url中的含義 |
編碼 |
+ |
URL 中+號表示空格 |
%2B |
空格 |
URL中的空格能夠用+號或者編碼 |
%20 |
/ |
分隔目錄和子目錄 |
%2F |
? |
分隔實際的URL和參數 |
%3F |
% |
指定特殊字符 |
%25 |
# |
表示書籤 |
%23 |
& |
URL中指定的參數間的分隔符 |
%26 |
= |
URL中指定參數的值 |
%3D |