python 爬蟲(三)cookie和session + 爬蟲中使用cookie或session實現登錄 + 代理的設置(解決ip被封問題)

一、cookie和session


1.產生的緣由


Http有個特點,即無狀態。Http無狀態是指Http協議對事務處理沒有記憶能力,當我們向服務器發送請求後,服務器處理請求之後返回結果。這是一個獨立的過程,再次向服務器發出請求,服務器做出響應又是一次獨立的過程,服務器不會記錄前後狀態變化。因此,服務器並不知道收到的兩次請求是否來自同一個用戶。這種效果並不是我們想要的。爲了保持前後的狀態,我們需要將前面所有請求中的數據再重傳一次,這是非常麻煩和浪費資源的。爲了解決這個問題,用於保持HTTP連接狀態的Session和Cookies就出現了。


2.cookie和session存放位置


  • cookie是在客戶端記錄狀態,一般存放在客戶端
  • session是在服務器端記錄狀態,一般存在服務器或數據庫中

3. cookie


① cookie定義


  • cookies 指某些網站爲了辨別用戶身份、進行會話跟蹤而存儲在用戶本地終端上的數據。
  • Cookie中包含了一個由名字=值(name=value)這樣的信息構成的任意列表,通過Set-Cookie或Set-Cookie2HTTP響應(擴展)首部將其貼到客戶端身上。

② cookie的分類


  • 會話cookie
    • 定義:不設置過期時間,在瀏覽器內存中存儲的cookie,瀏覽器關閉,會話cookie失效
  • 持久cookie
    • 定義:保存在硬盤的cookie

注意:這兩種cookie分配的標準主要是通過MaxAge或Expires這個cookie的字段來定義的----->爲負數,則爲會話cookie。


③ cookie的組成(屬性)


因爲最開始的cookie是網景公司定義的,後來又有了RFC版本。
所以當前的Cookie有兩個版本:Version0和Version1。
他們有兩種設置響應頭的標識,分別是:Set-Cookie和Set-Cookie2,
這也造成了一些屬性的不同,這裏需要注意:常用的爲Version0

  • Version0的屬性
cookie屬性 作用
NAME=Value 鍵值對設置要保存的Name/Value,這裏的name不能喝其他屬性的名字一樣。Name : 該cookie的名稱。一旦創建, 該名稱便不可更改。value : 該cookie 的值。如果值爲Unicode 字符, 需要爲字符編碼。如果值爲二進制數據, 則需要使用BASE64 編碼。
Domain 可以訪問該cookle 的域名。例如, 如果設置爲.zhihu.com , 則所有以zhihu.com 結尾的域名都可以訪問該cookie。
MaxAge/Expires 該cookie 失效的時間, 單位爲秒, 也常和Expires— 起使用, 通過它可以計算出其有效時間。Max Age 如果爲正數, 則該cookie 在Max Age 秒之後失效。如果爲負數, 則關閉瀏覽器時cookie 即失效, 瀏覽器也不會以任何形式保存該cookie 。
Path 該cookie 的使用路徑。如果設置爲/path/ , 則只有路徑爲/ path / 的頁面可以訪問該cookie 。如果設置爲/ , 則本域名下的所有頁面都可以訪問該cookieo
Size 此Cookie 的大小
HTTP cookie 的httponly 屬性。若此屬性爲true , 則只有在HTTP 頭中會帶有此Cookie 的信息, 而不能通過document.cookie 來訪問此Cookie。
Secure 該cookie 是否僅被使用安全協議傳輸。安全協議有H TTP s 和SSL 等, 在網絡上傳輸數據之前先將數據加密。默認爲false。
  • Version1的屬性
cookie屬性 作用
Name=VALUE 鍵值對設置要保存的Name/Value,這裏的name不能喝其他屬性的名字一樣
Comment 用於說明該Cookie有什麼用途
CommentURL 該服務器爲此COokie提供URI註釋
Discard 是否在回話結束丟棄該Cookie,默認爲false
Domain 生成該Cookie的域名
Max-Age 最大失效時間,與Version0不同的是這裏設置的是在多少秒後失效
Path 該Cookie是在當前的哪個路徑下生成
Port 該Cookie在什麼端口下可以回傳服務端,如果有多個端口,以逗號隔開
Secure 如果設置了這個屬性,那麼只會在SSH連接時纔會回傳該Cookie

④ cookie被用戶禁用,如何使用session?


  • cookie和session一般是配合使用的,當cookie被用戶禁用,session如何使用
  • 兩種方法:
    • 方法一:提示用戶必須開啓
    • 方法二:使用url重傳。------->就是將sessionid附帶url後面傳遞給服務器

⑤ 常見誤區


在這裏插入圖片描述


4. session


① session的由來


上面我們知道了Cookie可以讓服務器端跟蹤每個客戶端的訪問,但是每次客戶端的訪問都必須傳回這些Cookie,如果Cookie很多,這無形地增加了客戶端與服務端的數據傳輸量,而Session的出現正是爲了解決這個問題。
同一個客戶端每次和服務端交互時,不需要每次都傳回所有的Cookie值,而是隻要傳回一個ID這個ID是客戶端第一次訪問服務器的時候生成的,而且每個客戶端是唯一的。這樣每個客戶端就有了一個唯一的ID,客戶端只要傳回這個ID就行了,這個ID通常是NANE爲JSESIONID的一個Cookie。所以Session其實是利用Cookie進行信息處理的。


② session的定義


對於session,會話, 其本來的含義是指有始有終的一系列動作/ 消息。而在web 中, 會話對象用來存儲特定用戶會話所需的屬性及配置信息。


③ session流程


當客戶端發送一個cookie,服務器會從這個cookie中找到sessionId,在查找出相應session信息返回給客戶端,來進行用戶頁面的流轉。如果通過sessionid來查找session,發現session沒有,因爲第一次登陸,就會創建一個session。在session有效期內,繼續訪問該頁面,服務器就會直接查找到這個session返回給客戶端。


④ session失效時間


當session的失效時間到達時失效,一般是30分鐘。


5. session和cookie的區別


  • cookie和session的共同之處在於: cookie和session都是用來跟蹤瀏覽器用戶身份的會話方式。

  • cookie和session的區別是:

    • cookie數據保存在客戶端,session數據保存在服務器端。
    • cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,如果主要考慮到安全應當使用session,當然也沒有絕對的安全,只是相對cookie,session更加安全。
    • session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能,如果主要考慮到減輕服務器性能方面,應當使用COOKIE
    • cookie校驗速度快,session校驗速度慢
  • 對於session,會話, 其本來的含義是指有始有終的一系列動作/ 消息。而在web 中, 會話對象用來存儲特定用戶會話所需的屬性及配置信息。

  • cookies 指某些網站爲了辨別用戶身份、進行會話跟蹤而存儲在用戶本地終端上的數據。

  • 產生緣由:由於http是一個無狀態的協議,每次請求如果需要之前請求的一些信息,此時必須重新發送之前的請求。爲了解決這種問題,產生了一種記錄狀態技術-----就是cookie和session

  • cookie是在客戶端記錄狀態,session是在服務器端記錄狀態

  • 聯繫:當客戶端發送一個cookie,服務器會從這個cookie中找到sessionId,在查找出相應session信心返回給客戶端,來進行用戶頁面的流轉。如果通過sessionid來查找session,發現session沒有,因爲第一次登陸,就會創建一個session。在session有效期內,繼續訪問該頁面,服務器就會直接查找到這個session返回給客戶端。

總結:cookie和session各有優缺點,所以將登陸信息等重要信息存放爲SESSION;其他信息如果需要保留,可以放在COOKIE中


二、使用cookie或session登錄


1. 爬蟲中登錄的實現方法


  • 兩種方法:
    • 第一種:封裝登錄後頁面中的cookie在請求頭中
    • 第二種:使用requests的session對象,來做到登錄。
session = requests.session()
這個session對象可以記錄登錄狀態。

2. 使用cookie登錄的兩種方法


① 直接放在headers頭部中


案例:使用cookie登錄人人網

import requests

base_url = 'http://www.renren.com/972683074/newsfeed/photo'

## 通過cookie來做到登錄時,我們必須拿瀏覽器中登陸後的頁面中的cookie來進行封裝

headers = {
'Cookie': 'headers中的cookie',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
}

response = requests.get(base_url,headers=headers)

if "飄雪" in response.text:
    print("登錄人人網個人頁成功")
else:
    print("登錄失敗")

通過客戶端cookie將我們的信息傳到服務器,服務器驗證成功後允許登錄訪問,我們拿到的就是這個cookie封裝後的結果
在這裏插入圖片描述


② 使用requests插入Cookie


import requests

base_url = 'http://www.renren.com/972683074/newsfeed/photo'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
}
cookie = {'Cookie': 'headers中的cookie'}
requests.get(url,cookies=cookie,headers=headers).text

3. 使用session登錄


在登錄頁面通過form表單的提交地址,提交用戶名密碼登錄
在這裏插入圖片描述
案例:人人網

import requests

base_url = 'http://www.renren.com/PLogin.do'
headers= {
    'Host': 'www.renren.com',
    'Referer': 'http://safe.renren.com/security/account',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
}
data = {
    'email':'13016031459',
    'password':'Abc12345^',
}
#創建一個session對象
se = requests.session()
#用session對象來發送post請求進行登錄。
se.post(base_url,headers=headers,data=data)
response = se.get('http://www.renren.com/971682585')

if '鳴人' in response.text:
    print('登錄成功!')
else:
    print(response.text)
    print('登錄失敗!')

三、代理的設置


1. 代理的基本原理


在這裏插入圖片描述


2. 代理的作用


在這裏插入圖片描述


3. 代理的分類


① 根據協議來區分


在這裏插入圖片描述


② 根據匿名程度來區分


在這裏插入圖片描述


③ 在requests中如何設置代理


  1. 創建一個代理字典
proxies = {
'http':代理ip
'https':'https://ip:port'
}
  1. 用get或post方法請求的時候,增加proxies這個參數就可以了
requests.get(proxies = proxies)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章