selenium cookie 登入
前言
爬蟲方向的小夥伴們都知道網頁爬蟲經常遇到的問題就是登入賬戶,有些簡單的網站我們可以簡單的send key來輸入賬戶密碼就可以登入,但是有很多網站需要驗證碼之類的就不太好用了,這時候就體現到了cookie登入的優點了,前段時間網上搜了搜,發現沒有什麼完整的教程,本文就使用selenium來cookie登入為例做一個簡單的教程。
環境準備
- python3
- selenium
- chromedriver
selenium就不再過多解釋了,我們在使用的過程中唯一需要注意的就是自己瀏覽器版本與driver版本的問題,至於具體對應版本,在chromedriver下載頁面中會有顯示
程式碼編寫
這次就以 百度 為例,www.baidu.com 首先使用 selenium 開啟百度看一下未登入是什麼樣子
程式碼:
from selenium import webdriver #填寫webdriver的儲存目錄 driver = webdriver.Chrome('../chromedriver.exe') #記得寫完整的url 包括http和https driver.get('https://www.baidu.com')
這就是直接開啟的樣子,我們想要將網頁變成登入後的樣子,如下圖
這是登入賬號後的樣子,那麼我們該怎麼獲取cookie以達到登入效果呢?
我們可以直接使用F12檢視當前網頁的cookie,但是你會發現直接獲取到的並不是那麼好插入到selenium中,因為cookie在瀏覽器中實際是這個樣子的
它需要額外新增一些東西,那麼我們該如何獲取呢?其實也很簡單,最簡單的方法就是我們首先使用selenium手動登入一下然後獲取cookie值儲存到本地,之後再登陸的時候直接呼叫本地cookie就可以了
怎麼獲取呢?selenium有一個 get_cookies() 函式可以幫我們獲取當前網頁的cookie值,所以我們首先編寫一個 getcookies.py 檔案來獲取cookie值
from selenium import webdriver import time import json #填寫webdriver的儲存目錄 driver = webdriver.Chrome('../chromedriver.exe') #記得寫完整的url 包括http和https driver.get('https://www.baidu.com') #程式開啟網頁後20秒內手動登陸賬戶 time.sleep(20) with open('cookies.txt','w') as cookief: #將cookies儲存為json格式 cookief.write(json.dumps(driver.get_cookies())) driver.close()
執行程式後如下圖 點選登入 輸入賬號密碼,輸入驗證碼(程式內寫的20秒完成操作,因為20秒後程式將獲得cookies)
現在發現專案目錄下已經有了一個名稱為 cookies.txt 的檔案 ,現在我們已經將cookies儲存到了本地,現在我們來編寫程式使用cookies
編寫 addcookies.py 檔案
from selenium import webdriver import time import json #填寫webdriver的儲存目錄 driver = webdriver.Chrome('../chromedriver.exe') #記得寫完整的url 包括http和https driver.get('https://www.baidu.com') #首先清除由於瀏覽器開啟已有的cookies driver.delete_all_cookies() with open('cookies.txt','r') as cookief: #使用json讀取cookies 注意讀取的是檔案 所以用load而不是loads cookieslist = json.load(cookief) for cookie in cookieslist: driver.add_cookie(cookie)
執行,有小夥伴可能會發現現在出問題了,在插入cookie的時候 返回錯誤
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'
這個 expiry 是什麼呢? 它是cookie的生命週期,也就是失效時間,為什麼在這裡會報錯呢?我們有兩種解決辦法
- #方法1 將expiry型別變為int(其實不太清楚為什麼變為int就可以)
- #方法2刪除該欄位
重新編寫程式碼:
from selenium import webdriver import json #填寫webdriver的儲存目錄 driver = webdriver.Chrome('../chromedriver.exe') #記得寫完整的url 包括http和https driver.get('https://www.baidu.com') #首先清除由於瀏覽器開啟已有的cookies driver.delete_all_cookies() with open('cookies.txt','r') as cookief: #使用json讀取cookies 注意讀取的是檔案 所以用load而不是loads cookieslist = json.load(cookief) # 方法1 將expiry型別變為int for cookie in cookieslist: #並不是所有cookie都含有expiry 所以要用dict的get方法來獲取 if isinstance(cookie.get('expiry'), float): cookie['expiry'] = int(cookie['expiry']) driver.add_cookie(cookie) #方法2刪除該欄位 # for cookie in cookieslist: # #該欄位有問題所以刪除就可以 瀏覽器開啟後記得重新整理頁面 有的網頁注入cookie後仍需要重新整理一下 # if 'expiry' in cookie: # del cookie['expiry'] # driver.add_cookie(cookie)
這時候發現沒有報錯了,可以發現,怎麼還是登入之前的頁面啊?為什麼cookies插入成功了卻不是登陸後的頁面?
別急,這時候我們點選一下瀏覽器的重新整理就會發現其實已經登入上去了只不過頁面沒有變化而已,所以一定記得點重新整理,現在我們就成功的使用cookie完成了登入操作。