溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python爬蟲中會(huì)話和Cookies是什么

發(fā)布時(shí)間:2020-08-07 14:35:03 來源:億速云 閱讀:218 作者:小新 欄目:編程語言

這篇文章主要介紹了Python爬蟲中會(huì)話和Cookies是什么,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

在瀏覽網(wǎng)站的過程中,我們經(jīng)常會(huì)遇到需要登錄的情況,有些頁面只有登錄之后才可以訪問,而且登錄之后可以連續(xù)訪問很多次網(wǎng)站,但是有時(shí)候過一段時(shí)間就需要重新登錄。還有一些網(wǎng)站,在打開瀏覽器時(shí)就自動(dòng)登錄了,而且很長時(shí)間都不會(huì)失效,這種情況又是為什么?其實(shí)這里面涉及會(huì)話和Cookies的相關(guān)知識(shí),本節(jié)就來揭開它們的神秘面紗。

1. 靜態(tài)網(wǎng)頁和動(dòng)態(tài)網(wǎng)頁

在開始之前,我們需要先了解一下靜態(tài)網(wǎng)頁和動(dòng)態(tài)網(wǎng)頁的概念。這里還是前面的示例代碼,內(nèi)容如下:

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

這是最基本的HTML代碼,我們將其保存為一個(gè).html文件,然后把它放在某臺(tái)具有固定公網(wǎng)IP的主機(jī)上,主機(jī)上裝上Apache或Nginx等服務(wù)器,這樣這臺(tái)主機(jī)就可以作為服務(wù)器了,其他人便可以通過訪問服務(wù)器看到這個(gè)頁面,這就搭建了一個(gè)最簡單的網(wǎng)站。

這種網(wǎng)頁的內(nèi)容是HTML代碼編寫的,文字、圖片等內(nèi)容均通過寫好的HTML代碼來指定,這種頁面叫作靜態(tài)網(wǎng)頁。它加載速度快,編寫簡單,但是存在很大的缺陷,如可維護(hù)性差,不能根據(jù)URL靈活多變地顯示內(nèi)容等。例如,我們想要給這個(gè)網(wǎng)頁的URL傳入一個(gè)name參數(shù),讓其在網(wǎng)頁中顯示出來,是無法做到的。

因此,動(dòng)態(tài)網(wǎng)頁應(yīng)運(yùn)而生,它可以動(dòng)態(tài)解析URL中參數(shù)的變化,關(guān)聯(lián)數(shù)據(jù)庫并動(dòng)態(tài)呈現(xiàn)不同的頁面內(nèi)容,非常靈活多變。我們現(xiàn)在遇到的大多數(shù)網(wǎng)站都是動(dòng)態(tài)網(wǎng)站,它們不再是一個(gè)簡單的HTML,而是可能由JSP、PHP、Python等語言編寫的,其功能比靜態(tài)網(wǎng)頁強(qiáng)大和豐富太多了。

此外,動(dòng)態(tài)網(wǎng)站還可以實(shí)現(xiàn)用戶登錄和注冊(cè)的功能。再回到開頭提到的問題,很多頁面是需要登錄之后才可以查看的。按照一般的邏輯來說,輸入用戶名和密碼登錄之后,肯定是拿到了一種類似憑證的東西,有了它,我們才能保持登錄狀態(tài),才能訪問登錄之后才能看到的頁面。

那么,這種神秘的憑證到底是什么呢?其實(shí)它就是會(huì)話和Cookies共同產(chǎn)生的結(jié)果,下面我們來一探究竟。

2. 無狀態(tài)HTTP

在了解會(huì)話和Cookies之前,我們還需要了解HTTP的一個(gè)特點(diǎn),叫作無狀態(tài)。

HTTP的無狀態(tài)是指HTTP協(xié)議對(duì)事務(wù)處理是沒有記憶能力的,也就是說服務(wù)器不知道客戶端是什么狀態(tài)。當(dāng)我們向服務(wù)器發(fā)送請(qǐng)求后,服務(wù)器解析此請(qǐng)求,然后返回對(duì)應(yīng)的響應(yīng),服務(wù)器負(fù)責(zé)完成這個(gè)過程,而且這個(gè)過程是完全獨(dú)立的,服務(wù)器不會(huì)記錄前后狀態(tài)的變化,也就是缺少狀態(tài)記錄。這意味著如果后續(xù)需要處理前面的信息,則必須重傳,這導(dǎo)致需要額外傳遞一些前面的重復(fù)請(qǐng)求,才能獲取后續(xù)響應(yīng),然而這種效果顯然不是我們想要的。為了保持前后狀態(tài),我們肯定不能將前面的請(qǐng)求全部重傳一次,這太浪費(fèi)資源了,對(duì)于這種需要用戶登錄的頁面來說,更是棘手。

這時(shí)兩個(gè)用于保持HTTP連接狀態(tài)的技術(shù)就出現(xiàn)了,它們分別是會(huì)話和Cookies。會(huì)話在服務(wù)端,也就是網(wǎng)站的服務(wù)器,用來保存用戶的會(huì)話信息;Cookies在客戶端,也可以理解為瀏覽器端,有了Cookies,瀏覽器在下次訪問網(wǎng)頁時(shí)會(huì)自動(dòng)附帶上它發(fā)送給服務(wù)器,服務(wù)器通過識(shí)別Cookies并鑒定出是哪個(gè)用戶,然后再判斷用戶是否是登錄狀態(tài),然后返回對(duì)應(yīng)的響應(yīng)。

我們可以理解為Cookies里面保存了登錄的憑證,有了它,只需要在下次請(qǐng)求攜帶Cookies發(fā)送請(qǐng)求而不必重新輸入用戶名、密碼等信息重新登錄了。

因此在爬蟲中,有時(shí)候處理需要登錄才能訪問的頁面時(shí),我們一般會(huì)直接將登錄成功后獲取的Cookies放在請(qǐng)求頭里面直接請(qǐng)求,而不必重新模擬登錄。

好了,了解會(huì)話和Cookies的概念之后,我們?cè)趤碓敿?xì)剖析它們的原理。

(1) 會(huì)話

會(huì)話,其本來的含義是指有始有終的一系列動(dòng)作/消息。比如,打電話時(shí),從拿起電話撥號(hào)到掛斷電話這中間的一系列過程可以稱為一個(gè)會(huì)話。

而在Web中,會(huì)話對(duì)象用來存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。這樣,當(dāng)用戶在應(yīng)用程序的Web頁之間跳轉(zhuǎn)時(shí),存儲(chǔ)在會(huì)話對(duì)象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去。當(dāng)用戶請(qǐng)求來自應(yīng)用程序的Web頁時(shí),如果該用戶還沒有會(huì)話,則Web服務(wù)器將自動(dòng)創(chuàng)建一個(gè)會(huì)話對(duì)象。當(dāng)會(huì)話過期或被放棄后,服務(wù)器將終止該會(huì)話。

(2) Cookies

Cookies指某些網(wǎng)站為了辨別用戶身份、進(jìn)行會(huì)話跟蹤而存儲(chǔ)在用戶本地終端上的數(shù)據(jù)。

會(huì)話維持

那么,我們?cè)鯓永肅ookies保持狀態(tài)呢?當(dāng)客戶端第一次請(qǐng)求服務(wù)器時(shí),服務(wù)器會(huì)返回一個(gè)請(qǐng)求頭中帶有Set-Cookie字段的響應(yīng)給客戶端,用來標(biāo)記是哪一個(gè)用戶,客戶端瀏覽器會(huì)把Cookies保存起來。當(dāng)瀏覽器下一次再請(qǐng)求該網(wǎng)站時(shí),瀏覽器會(huì)把此Cookies放到請(qǐng)求頭一起提交給服務(wù)器,Cookies攜帶了會(huì)話ID信息,服務(wù)器檢查該Cookies即可找到對(duì)應(yīng)的會(huì)話是什么,然后再判斷會(huì)話來以此來辨認(rèn)用戶狀態(tài)。

在成功登錄某個(gè)網(wǎng)站時(shí),服務(wù)器會(huì)告訴客戶端設(shè)置哪些Cookies信息,在后續(xù)訪問頁面時(shí)客戶端會(huì)把Cookies發(fā)送給服務(wù)器,服務(wù)器再找到對(duì)應(yīng)的會(huì)話加以判斷。如果會(huì)話中的某些設(shè)置登錄狀態(tài)的變量是有效的,那就證明用戶處于登錄狀態(tài),此時(shí)返回登錄之后才可以查看的網(wǎng)頁內(nèi)容,瀏覽器再進(jìn)行解析便可以看到了。

反之,如果傳給服務(wù)器的Cookies是無效的,或者會(huì)話已經(jīng)過期了,我們將不能繼續(xù)訪問頁面,此時(shí)可能會(huì)收到錯(cuò)誤的響應(yīng)或者跳轉(zhuǎn)到登錄頁面重新登錄。

所以,Cookies和會(huì)話需要配合,一個(gè)處于客戶端,一個(gè)處于服務(wù)端,二者共同協(xié)作,就實(shí)現(xiàn)了登錄會(huì)話控制。

屬性結(jié)構(gòu)

接下來,我們來看看Cookies都有哪些內(nèi)容。這里以知乎為例,在瀏覽器開發(fā)者工具中打開Application選項(xiàng)卡,然后在左側(cè)會(huì)有一個(gè)Storage部分,最后一項(xiàng)即為Cookies,將其點(diǎn)開,如圖2-13所示,這些就是Cookies。

Python爬蟲中會(huì)話和Cookies是什么

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

Name:該Cookie的名稱。一旦創(chuàng)建,該名稱便不可更改。

Value:該Cookie的值。如果值為Unicode字符,需要為字符編碼。如果值為二進(jìn)制數(shù)據(jù),則需要使用BASE64編碼。

Domain:可以訪問該Cookie的域名。例如,如果設(shè)置為.zhihu.com,則所有以zhihu.com,結(jié)尾的域名都可以訪問該Cookie。

Max Age:該Cookie失效的時(shí)間,單位為秒,也常和Expires一起使用,通過它可以計(jì)算出其有效時(shí)間。Max Age如果為正數(shù),則該Cookie在Max Age秒之后失效。如果為負(fù)數(shù),則關(guān)閉瀏覽器時(shí)Cookie即失效,瀏覽器也不會(huì)以任何形式保存該Cookie。

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

Size字段:此Cookie的大小。

HTTP字段:Cookie的httponly屬性。若此屬性為true,則只有在HTTP頭中會(huì)帶有此Cookie的信息,而不能通過document.cookie來訪問此Cookie。

Secure:該Cookie是否僅被使用安全協(xié)議傳輸。安全協(xié)議有HTTPS和SSL等,在網(wǎng)絡(luò)上傳輸數(shù)據(jù)之前先將數(shù)據(jù)加密。默認(rèn)為false。

會(huì)話Cookie和持久Cookie

從表面意思來說,會(huì)話Cookie就是把Cookie放在瀏覽器內(nèi)存里,瀏覽器在關(guān)閉之后該Cookie即失效;持久Cookie則會(huì)保存到客戶端的硬盤中,下次還可以繼續(xù)使用,用于長久保持用戶登錄狀態(tài)。

其實(shí)嚴(yán)格來說,沒有會(huì)話Cookie和持久Cookie之分,只是由Cookie的Max Age或Expires字段決定了過期的時(shí)間。

因此,一些持久化登錄的網(wǎng)站其實(shí)就是把Cookie的有效時(shí)間和會(huì)話有效期設(shè)置得比較長,下次我們?cè)僭L問頁面時(shí)仍然攜帶之前的Cookie,就可以直接保持登錄狀態(tài)。

3. 常見誤區(qū)

在談?wù)摃?huì)話機(jī)制的時(shí)候,常常聽到這樣一種誤解“只要關(guān)閉瀏覽器,會(huì)話就消失了”,這種理解是錯(cuò)誤的??梢韵胂笠幌聲?huì)員卡的例子,除非顧客主動(dòng)對(duì)店家提出銷卡,否則店家絕對(duì)不會(huì)輕易刪除顧客的資料。對(duì)會(huì)話來說,也是一樣,除非程序通知服務(wù)器刪除一個(gè)會(huì)話,否則服務(wù)器會(huì)一直保留。比如,程序一般都是在我們做注銷操作時(shí)才去刪除會(huì)話。

但是當(dāng)我們關(guān)閉瀏覽器時(shí),瀏覽器不會(huì)主動(dòng)在關(guān)閉之前通知服務(wù)器它將要關(guān)閉,所以服務(wù)器根本不會(huì)有機(jī)會(huì)知道瀏覽器已經(jīng)關(guān)閉。之所以會(huì)有這種錯(cuò)覺,是因?yàn)榇蟛糠謺?huì)話機(jī)制都使用會(huì)話Cookie來保存會(huì)話ID信息,而關(guān)閉瀏覽器后Cookies就消失了,再次連接服務(wù)器時(shí),也就無法找到原來的會(huì)話了。如果服務(wù)器設(shè)置的Cookies保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的HTTP請(qǐng)求頭,把原來的Cookies發(fā)送給服務(wù)器,則再次打開瀏覽器,仍然能夠找到原來的會(huì)話 ID,依舊還是可以保持登錄狀態(tài)的。

而且恰恰是由于關(guān)閉瀏覽器不會(huì)導(dǎo)致會(huì)話被刪除,這就需要服務(wù)器為會(huì)話設(shè)置一個(gè)失效時(shí)間,當(dāng)距離客戶端上一次使用會(huì)話的時(shí)間超過這個(gè)失效時(shí)間時(shí),服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng),才會(huì)把會(huì)話刪除以節(jié)省存儲(chǔ)空間。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Python爬蟲中會(huì)話和Cookies是什么內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI