python爬蟲登錄保持及對http總結


【前言】這幾天一直看python爬蟲登錄保持。實現接口太多,太亂,新手難免雲山霧罩。各種get、post,深入理解一下,其實就是由於http的特性需要這些操作。http是一種無狀態、不保存上次通信結果的一種網絡傳輸協議,雖然基於tcp但是不是連接的。

  本文先從原理角度介紹http各種特性,然后基於python語言,介紹其比較出名的一個http庫——requests。主要會參考其中文的【開發文檔】來總結,翻譯的還是不錯的。下面這幅圖片是我截的文檔開頭,我一直認為真正的高手應該對其知識信手拈來,可以以一種風趣幽默的形式展現出來。哈哈,扯遠了。

參考:《圖解http》和https://blog.csdn.net/u011054333/article/details/69486364

一、http基礎知識

  web使用http(超文本傳輸協議)來實現客戶端與服務器通信。htttp屬於tcp/ip協議族(四層),位於應用層。1、應用層協議是各種進程間通信的規則;2、傳輸層主要就是tcp和udp;3、網絡層ipv4/6,用來對網絡上的數據包進行封裝,數據包是網絡傳輸的最小數據單位,該層規定使用怎樣的路徑將數據包傳給對方。要准確的到達目的地址,IP協議有兩個量:ip和mac,解決局域網問題。ip通過ARP協議可以反查mac4、鏈路層,網絡的硬件部分,網卡的驅動協議等。注意封裝是逐級的,打包和解包的過程。

二、請求和響應報文

 請求: headers={}    由三部分組成

1、請求方法:get()、post()至少掌握,其他put(......以后再說。eg:GET/sample.jspHTTP/1.1(方法/URi/版本協議)大神講解:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

  簡單說,get是明文請求url信息,因為所有的響應返回信息都會跟在url中的?后面,用&連接參數,相對不安全,而且響應不會對當前瀏覽器產生影響;post的是攜帶信息請求,會把信息都封裝在報文里面,相對安全,收到響應后瀏覽器界面也隨即改變了。

2、請求頭:connection默認設置為keep-alive這樣在一次TCP連接時可以多次發送接收數據,提高吞吐,即持久連接,下面有介紹。

  還有其他那幾個一般默認,唯一必須傳的就是user-agent:瀏覽器的版本。

  ...(還有好多)

3、請求正文:密碼,用戶名可以寫在headers里面,python是攜帶在data={}里面提交。一樣的,其實就是覆蓋。

    響應:HTTP響應也由3個部分構成

1、狀態行:狀態行由協議版本、數字形式的狀態代碼、及相應的狀態描述,各元素之間以空格分隔。eg :HTTP/1.1 200 OK

其中:200為狀態代碼。第一個數字有五種可能的取值:

  - 1xx:   指示信息—表示請求已接收,繼續處理。

  - 2xx:   成功—表示請求已經被成功接收、理解、接受。

  - 3xx:   重定向—要完成請求必須進行更進一步的操作。

  - 4xx:   客戶端錯誤—請求有語法錯誤或請求無法實現。

  - 5xx: 服務器端錯誤—服務器未能實現合法的請求

2、響應頭: 

服務器端軟件xinxi:Server:Apache Tomcat/5.0.12

時間:Date:Mon,6Oct2003 13:23:42 GMT

正文長度:Content-Length:112

三、幾種數據傳輸方式

1、無狀態

  http協議是一種自身不對請求和響應之間的通信狀態進行保存的協議,即無狀態協議。這種設置的好處是:更快的處理更多的請求事務,j減輕服務器負擔,確保協議的可伸縮性(快速型?)。不過隨着web的不斷發展,有時候需要將這種狀態進行保持,例如保持登錄。隨即,就引入了cookie技術,cookie技術通過在請求和響應報文中寫入cookie信息來控制客戶端的狀態。

2、持久性

  最初版本的http確實是連接一次收到一條數據就斷開,然后周而復始的tcp三次握手,四次揮手。現在html里面會包含其他請求文件,這樣頻繁斷開消耗太大,提出持久化技術:keep-alive.一次連接多次收發數據的次數,默認開啟,次數在服務器端設置,一般300。

3、線管化

  在連接中,一次請求發出不用等待收到響應,就可以發出其他的請求。

4、內容編碼

  由於某些報文的內容過大,因此在傳輸時,為了減少傳輸的時間,會采取一些壓縮的措施。例如上面的報文信息中,Accept-Encoding就定義了內容編碼的格式:gzip(GUN壓縮格式)

5、cookie  

  Cookie 會根據從服務器端發送的響應報文內的一個叫做 Set-Cookie 首部字段信息, 通知客戶端保存 Cookie。 當下次客戶端再往該服務器發送請求時, 客戶端會自動在請求報文中加入 Cookie 值后發送出去。 這樣服務器端只需要保存剛剛向誰發送了這個cookie,一對比就知道是誰了。一定程度解決了登錄保持是不會給服務器帶來太大負擔,而且服務器留存cookie的記錄有個有效時長,一定時間收不到客戶端的cookie就會清除記錄。

  區分一下攜帶cookie和保持session.

6、數據轉發:代理、網管、隧道  

  HTTP 通信時, 除客戶端和服務器以外, 還有一些用於通信數據轉發的應用程序, 例如代理、 網關和隧道。 它們可以配合服務器工作。 這些應用程序和服務器可以將請求轉發給通信線路上的下一站服務器, 並且能接收從那台服務器發送的響應再轉發給客戶端。 

  6.1代理    

  代理服務器的基本行為就是接收客戶端發送的請求后轉發給其他服務器。 代理不改變請求 URI, 會直接發送給前方持有資源的目標服務器。持有資源實體的服務器被稱為源服務器。 從源服務器返回的響應經過代理服務器后再傳給客戶端。 緩存代理:代理轉發響應時, 緩存代理(Caching Proxy) 會預先將資源的副本(緩存) 保存在代理服務器上。 當代理再次接收到對相同資源的請求時, 就可以不從源服務器那里獲取資源, 而是將之前緩存的資源作為響應返回。 透明代理:不對收到的報文信息做任何修改。

  不僅有服務器緩存,還有客戶端緩存。識別驗證碼的時候帶上時間戳就是避免瀏覽器緩存的一種機制。

  6、2網關

  網關的作用和位置和代理差不多,不同的是,網關可以對http報文分析,然后和其他的服務器進行非http通信,例如可以和安全系統聯動,分析數據安全性,也可以進行報文加密。

  6、3隧道

  一種長距離加密傳輸方式,透明存在。

四、http協議頭的詳解

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM