selenium cookie 登陸

前言

爬蟲方向的小夥伴們都知道網頁爬蟲常常遇到的問題就是登陸帳戶,有些簡單的網站咱們能夠簡單的send key來輸入帳戶密碼就能夠登陸,可是有不少網站須要驗證碼之類的就不太好用了,這時候就體現到了cookie登陸的優勢了,前段時間網上搜了搜,發現沒有什麼完整的教程,本文就使用selenium來cookie登陸爲例作一個簡單的教程。python


 

環境準備

  • python3
  • selenium
  • chromedriver

selenium就再也不過多解釋了,咱們在使用的過程當中惟一須要注意的就是本身瀏覽器版本與driver版本的問題,至於具體對應版本,在chromedriver下載頁面中會有顯示web


代碼編寫

此次就以 百度 爲例,www.baidu.com 首先使用 selenium 打開百度看一下未登陸是什麼樣子chrome

代碼:json

from selenium import webdriver #填寫webdriver的保存目錄
driver = webdriver.Chrome('../chromedriver.exe') #記得寫完整的url 包括http和https
driver.get('https://www.baidu.com')

這就是直接打開的樣子,咱們想要將網頁變成登陸後的樣子,以下圖網頁爬蟲

這是登陸帳號後的樣子,那麼咱們該怎麼獲取cookie以達到登陸效果呢?瀏覽器

咱們能夠直接使用F12查看當前網頁的cookie,可是你會發現直接獲取到的並非那麼好插入到selenium中,由於cookie在瀏覽器中實際是這個樣子的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)url

如今發現項目目錄下已經有了一個名稱爲 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完成了登陸操做。

相關文章
相關標籤/搜索