前言
爬蟲方向的小伙伴們都知道網頁爬蟲經常遇到的問題就是登錄賬戶,有些簡單的網站我們可以簡單的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完成了登錄操作。