????????在使用Selenium進行Web自動化時,添加網站Cookies是實現免登錄的一種高效方法。通過模擬瀏覽器行為,我們可以將已登錄狀態的Cookies存儲起來,并在下次自動化測試或爬蟲任務中直接加載這些Cookies,從而跳過登錄步驟。
Cookies簡介
????????Cookies是存儲在用戶本地終端上的一小塊數據,它會在瀏覽器向服務器發起請求時被攜帶并發送到服務器上。這些Cookies通常包含了用戶的會話信息,比如登錄狀態、用戶偏好設置等。簡而言之,Cookie就像是臨時身份證一樣,每次瀏覽器請求時都會攜帶它,以便服務器識別用戶身份或保持會話狀態,這也是為什么我們在一個網頁內登錄后關閉掉網頁,再次進入依然能夠保持登錄狀態的原因。
????????不過,為了安全起見,網站開發者通常會對Cookies設置過期時間,并且在過期后會被瀏覽器自動刪除。此外,Cookies的存儲位置也有限制,通常只能在設置它們的域名下訪問,這在一定程度上保護了用戶的隱私安全。
這里以CSDN為例
????????打開瀏覽器開發者工具,查看當前html的cookie信息,Expire一欄是cookie過期時間,會話一般表示關閉網頁后這個cookie就過期。
selenium中針對cookie的操作
????????在selenium中,有以下幾個方法用來管理和操作當前網頁內的cookie:
這里假設我們已經設定好一個webdriver對象名為browser
獲取當前網頁內的cookie
cookies=browser.get_cookies()
#cookies是List[dict],[{},{},{}]的格式
添加cookie至當前網頁
browser.add_cookie('cookie字典')
刪除單個cookie
browser.delete_cookie('cookie名稱')
刪除所有cookie
browser.delete_all_cookies()
通過cookie實現免登錄
步驟
? ? ? ? 由于沒有用戶數據,webdriver每次打開一個網頁都相當于新啟動一個瀏覽器打開該網頁
????????因此,在一些需要登錄的網站,我們可以先試用webdriver打開該網頁,接著手動掃碼登錄后,使用get_all_cookies()方法將登錄后網頁的cookies先保存到本地,建議使用json。
????????然后下一次使用webdriver打開該網站時,再使用add_cookie()方法把先前的登錄后的cookie數據添加到webdriver中,接著刷新頁面,網站便會順間恢復到已登錄的狀態。
源代碼
???????這里以Edge為例,其余瀏覽器方法一樣,將webdriver類型更換即可。
???獲取登錄后的網頁cookies
import json
import time
from selenium.webdriver.edge.options import Options
from selenium import webdriver
edge_options=Options()
edge_options.add_argument('--disable-blink-features=AutomationControlled')
browser=webdriver.Edge(options=edge_options)
browser.get('URL')#請將URL替換為你要登錄的網站的URL
browser.maximize_window()
time.sleep(20)#等待20秒,這20秒用來手動登錄,若時間不夠,請自行調整
cookies=browser.get_cookies()
with open('cookies.json','w') as f:f.write(json.dumps(cookies))#將cookies保存到本地cookies.json文件中
browser.quit()
將保存到本地的cookie數據添加到webdriver中
import json
from selenium.webdriver.edge.options import Options
from selenium import webdriver
edge_options=Options()
edge_options.add_argument('--disable-blink-features=AutomationControlled')
browser=webdriver.Edge(options=edge_options)
browser.get('URL')#請將URL替換為你要登錄的網站的URL
browser.maximize_window()
with open('cookies.json','r') as f:cookies=json.loads(f.read())for cookie in cookies:cookie_dict = {'domain': cookie.get('domain'),'name': cookie.get('name'),'value': cookie.get('value'),"expires": '','path': '/','httpOnly': False,'HostOnly': False,'Secure': False}browser.add_cookie(cookie_dict)browser.refresh()
#執行后續操作
效果
webdriver剛啟動打開csdn主頁?
添加cookie并刷新頁面后?
????????經驗證,csdn網頁端的cookie有效時長超過24小時,負責維護登錄狀態的cookie可能UserToken,Username,Userinfo等cookie,這幾個cookie的有效時長都超過24小時。
說明?
????????不同網站的cookie有效時長各不相同,為了安全起見,很多都是會話,因此保存在本地的cookie數據也需要定時更新,對此,你可以在瀏覽器的開發者工具中查看cookie的expire時間來決定更新的頻率。