Python爬蟲進階之會話和Cookies

piny發表於2021-09-11

Python爬蟲進階之會話和Cookies

在瀏覽網站的過程中,我們經常會遇到需要登入的情況,有些頁面只有登入之後才可以訪問,而且登入之後可以連續訪問很多次網站,但是有時候過一段時間就需要重新登入。還有一些網站,在開啟瀏覽器時就自動登入了,而且很長時間都不會失效,這種情況又是為什麼?其實這裡面涉及會話和Cookies的相關知識,本節就來揭開它們的神秘面紗。

1. 靜態網頁和動態網頁

在開始之前,我們需要先了解一下靜態網頁和動態網頁的概念。這裡還是前面的示例程式碼,內容如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>This is a Demo</title>
    </head>
    <body>
        <div id="container">
            <div class="wrapper">
                <h2 class="title">Hello World</h2>
                <p class="text">Hello, this is a paragraph.</p>
            </div>
        </div>
    </body>
</html>

這是最基本的HTML程式碼,我們將其儲存為一個.html檔案,然後把它放在某臺具有固定公網IP的主機上,主機上裝上Apache或Nginx等伺服器,這樣這臺主機就可以作為伺服器了,其他人便可以透過訪問伺服器看到這個頁面,這就搭建了一個最簡單的網站。

這種網頁的內容是HTML程式碼編寫的,文字、圖片等內容均透過寫好的HTML程式碼來指定,這種頁面叫作靜態網頁。它載入速度快,編寫簡單,但是存在很大的缺陷,如可維護性差,不能根據URL靈活多變地顯示內容等。例如,我們想要給這個網頁的URL傳入一個name引數,讓其在網頁中顯示出來,是無法做到的。

因此,動態網頁應運而生,它可以動態解析URL中引數的變化,關聯資料庫並動態呈現不同的頁面內容,非常靈活多變。我們現在遇到的大多數網站都是動態網站,它們不再是一個簡單的HTML,而是可能由JSP、PHP、Python等語言編寫的,其功能比靜態網頁強大和豐富太多了。

此外,動態網站還可以實現使用者登入和註冊的功能。再回到開頭提到的問題,很多頁面是需要登入之後才可以檢視的。按照一般的邏輯來說,輸入使用者名稱和密碼登入之後,肯定是拿到了一種類似憑證的東西,有了它,我們才能保持登入狀態,才能訪問登入之後才能看到的頁面。

那麼,這種神秘的憑證到底是什麼呢?其實它就是會話和Cookies共同產生的結果,下面我們來一探究竟。

2. 無狀態HTTP

在瞭解會話和Cookies之前,我們還需要了解HTTP的一個特點,叫作無狀態。

HTTP的無狀態是指HTTP協議對事務處理是沒有記憶能力的,也就是說伺服器不知道客戶端是什麼狀態。當我們向伺服器傳送請求後,伺服器解析此請求,然後返回對應的響應,伺服器負責完成這個過程,而且這個過程是完全獨立的,伺服器不會記錄前後狀態的變化,也就是缺少狀態記錄。這意味著如果後續需要處理前面的資訊,則必須重傳,這導致需要額外傳遞一些前面的重複請求,才能獲取後續響應,然而這種效果顯然不是我們想要的。為了保持前後狀態,我們肯定不能將前面的請求全部重傳一次,這太浪費資源了,對於這種需要使用者登入的頁面來說,更是棘手。

這時兩個用於保持HTTP連線狀態的技術就出現了,它們分別是會話和Cookies。會話在服務端,也就是網站的伺服器,用來儲存使用者的會話資訊;Cookies在客戶端,也可以理解為瀏覽器端,有了Cookies,瀏覽器在下次訪問網頁時會自動附帶上它傳送給伺服器,伺服器透過識別Cookies並鑑定出是哪個使用者,然後再判斷使用者是否是登入狀態,然後返回對應的響應。

我們可以理解為Cookies裡面儲存了登入的憑證,有了它,只需要在下次請求攜帶Cookies傳送請求而不必重新輸入使用者名稱、密碼等資訊重新登入了。

因此在爬蟲中,有時候處理需要登入才能訪問的頁面時,我們一般會直接將登入成功後獲取的Cookies放在請求頭裡面直接請求,而不必重新模擬登入。

好了,瞭解會話和Cookies的概念之後,我們在來詳細剖析它們的原理。

(1) 會話

會話,其本來的含義是指有始有終的一系列動作/訊息。比如,打電話時,從拿起電話撥號到結束通話電話這中間的一系列過程可以稱為一個會話。

而在Web中,會話物件用來儲存特定使用者會話所需的屬性及配置資訊。這樣,當使用者在應用程式的Web頁之間跳轉時,儲存在會話物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當使用者請求來自應用程式的Web頁時,如果該使用者還沒有會話,則Web伺服器將自動建立一個會話物件。當會話過期或被放棄後,伺服器將終止該會話。

(2) Cookies

Cookies指某些網站為了辨別使用者身份、進行會話跟蹤而儲存在使用者本地終端上的資料。

會話維持

那麼,我們怎樣利用Cookies保持狀態呢?當客戶端第一次請求伺服器時,伺服器會返回一個請求頭中帶有Set-Cookie欄位的響應給客戶端,用來標記是哪一個使用者,客戶端瀏覽器會把Cookies儲存起來。當瀏覽器下一次再請求該網站時,瀏覽器會把此Cookies放到請求頭一起提交給伺服器,Cookies攜帶了會話ID資訊,伺服器檢查該Cookies即可找到對應的會話是什麼,然後再判斷會話來以此來辨認使用者狀態。

在成功登入某個網站時,伺服器會告訴客戶端設定哪些Cookies資訊,在後續訪問頁面時客戶端會把Cookies傳送給伺服器,伺服器再找到對應的會話加以判斷。如果會話中的某些設定登入狀態的變數是有效的,那就證明使用者處於登入狀態,此時返回登入之後才可以檢視的網頁內容,瀏覽器再進行解析便可以看到了。

反之,如果傳給伺服器的Cookies是無效的,或者會話已經過期了,我們將不能繼續訪問頁面,此時可能會收到錯誤的響應或者跳轉到登入頁面重新登入。

所以,Cookies和會話需要配合,一個處於客戶端,一個處於服務端,二者共同協作,就實現了登入會話控制。

屬性結構

接下來,我們來看看Cookies都有哪些內容。這裡以知乎為例,在瀏覽器開發者工具中開啟Application選項卡,然後在左側會有一個Storage部分,最後一項即為Cookies,將其點開,如圖2-13所示,這些就是Cookies。

79cacad66091df06860ac0c2414176f.png

可以看到,這裡有很多條目,其中每個條目可以稱為Cookie。它有如下幾個屬性。

Name:該Cookie的名稱。一旦建立,該名稱便不可更改。

Value:該Cookie的值。如果值為Unicode字元,需要為字元編碼。如果值為二進位制資料,則需要使用BASE64編碼。

Domain:可以訪問該Cookie的域名。例如,如果設定為.zhihu.com,則所有以zhihu.com,結尾的域名都可以訪問該Cookie。

Max Age:該Cookie失效的時間,單位為秒,也常和Expires一起使用,透過它可以計算出其有效時間。Max Age如果為正數,則該Cookie在Max Age秒之後失效。如果為負數,則關閉瀏覽器時Cookie即失效,瀏覽器也不會以任何形式儲存該Cookie。

Path:該Cookie的使用路徑。如果設定為/path/,則只有路徑為/path/的頁面可以訪問該Cookie。如果設定為/,則本域名下的所有頁面都可以訪問該Cookie。

Size欄位:此Cookie的大小。

HTTP欄位:Cookie的httponly屬性。若此屬性為true,則只有在HTTP頭中會帶有此Cookie的資訊,而不能透過document.cookie來訪問此Cookie。

Secure:該Cookie是否僅被使用安全協議傳輸。安全協議有HTTPS和SSL等,在網路上傳輸資料之前先將資料加密。預設為false。

會話Cookie和持久Cookie

從表面意思來說,會話Cookie就是把Cookie放在瀏覽器記憶體裡,瀏覽器在關閉之後該Cookie即失效;持久Cookie則會儲存到客戶端的硬碟中,下次還可以繼續使用,用於長久保持使用者登入狀態。

其實嚴格來說,沒有會話Cookie和持久Cookie之分,只是由Cookie的Max Age或Expires欄位決定了過期的時間。

因此,一些持久化登入的網站其實就是把Cookie的有效時間和會話有效期設定得比較長,下次我們再訪問頁面時仍然攜帶之前的Cookie,就可以直接保持登入狀態。

3. 常見誤區

在談論會話機制的時候,常常聽到這樣一種誤解“只要關閉瀏覽器,會話就消失了”,這種理解是錯誤的。可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對會話來說,也是一樣,除非程式通知伺服器刪除一個會話,否則伺服器會一直保留。比如,程式一般都是在我們做登出操作時才去刪除會話。

但是當我們關閉瀏覽器時,瀏覽器不會主動在關閉之前通知伺服器它將要關閉,所以伺服器根本不會有機會知道瀏覽器已經關閉。之所以會有這種錯覺,是因為大部分會話機制都使用會話Cookie來儲存會話ID資訊,而關閉瀏覽器後Cookies就消失了,再次連線伺服器時,也就無法找到原來的會話了。如果伺服器設定的Cookies儲存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的Cookies傳送給伺服器,則再次開啟瀏覽器,仍然能夠找到原來的會話 ID,依舊還是可以保持登入狀態的。

而且恰恰是由於關閉瀏覽器不會導致會話被刪除,這就需要伺服器為會話設定一個失效時間,當距離客戶端上一次使用會話的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把會話刪除以節省儲存空間。

4. 參考資料

由於涉及一些專業名詞知識,本節的部分內容參考來源如下。

會話百度百科:

Cookies百度百科:

HTTP Cookie維基百科:

會話和幾種狀態保持方案理解:

眾多,盡在python學習網,歡迎線上學習!

本文轉自:https://cuiqingcai.com/5487.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2835471/,如需轉載,請註明出處,否則將追究法律責任。

相關文章