這次給大家帶來selenium+cookie跳過驗證碼登入實現步奏詳解,selenium+cookie跳過驗證碼登入的注意事項有哪些,下面就是實戰案例,一起來看一下。
之前介紹過通過cookie 繞過驗證碼實現登入的方法。這裡並不多餘,會增加分析和另外一種方法實現登入。
1、思路介紹
1.1、直接看代碼,內有詳細注釋說明
# FileName : Wm_Cookie_Login.py# Author : Adil# DateTime : 2018/3/20 19:47# SoftWare : PyCharmfrom selenium import webdriverimport timeurl = 'https://system.address'def login(): '''先定義一個正常登入的方法,擷取登入前和登入後的cookie''' driver = webdriver.Chrome() driver.get(url) driver.maximize_window() cookieBefore = driver.get_cookies() # 列印登入前的cookie print(cookieBefore) time.sleep(2) driver.find_element_by_id("new-username").clear() driver.find_element_by_id("new-username").send_keys("username") driver.implicitly_wait(5) driver.find_element_by_id("new-password").clear() driver.find_element_by_id("new-password").send_keys("password") driver.find_element_by_id('home-right-login').click() driver.implicitly_wait(5) # 加一個休眠,這樣得到的cookie 才是登入後的cookie,否則可能列印的還是登入前的cookie time.sleep(5) print("登入後!") cookiesAfter = driver.get_cookies() print("cookiesAfter:") print(cookiesAfter) # cookie 存放到了list,其中是dict # 對比發現登入後的cookie比登入前多了4個dict。 # 如下代碼分別是 1、4 、7、 8 len1 = len(cookiesAfter) print("len:%d" %len1) cookie1 = cookiesAfter[0] cookie2 = cookiesAfter[3] cookie3 = cookiesAfter[-2] cookie4 = cookiesAfter[-1] print("cookie1:%s" %cookie1) print("cookie2:%s" %cookie2) print("cookie3:%s" %cookie3) print("cookie4:%s" %cookie4) driver.quit() # 將擷取的這四個cookie作為參數,傳遞給,使用cookie登入的函數,如下 cookieLogin(cookie1,cookie2,cookie3,cookie4)def cookieLogin(cookie1,cookie2,cookie3,cookie4): print("+++++++++++++++++++++++++") print("cookieLogin") print("cookie2:%s" % cookie2) print("cookie4:%s" % cookie4) driver = webdriver.Chrome() driver.maximize_window() # 清除一下cookie driver.delete_all_cookies() time.sleep(3) driver.get(url) # 開啟瀏覽器後添加訪問地址後,添加cookie driver.add_cookie(cookie1) driver.add_cookie(cookie2) driver.add_cookie(cookie3) driver.add_cookie(cookie4) print("cookies") # 列印一下cookie,與上面正常登入的cookie對比一下 print(driver.get_cookies()) time.sleep(5) # 重新整理頁面,可以看到已經是登入狀態了,至此完成的使用cookie 的登入。 driver.refresh() time.sleep(5) driver.quit()if name == "main": login()
1.2、代碼介紹
,可以查看到登入前與登入後的cookie,將其拷貝出來,進行對比
,對比可以,登入後多餘四個cookie
查看多餘cookie的位置,是list 的1、4、7、8g額元素,所以將其取出,作為參數給cookie登入函數。
注意:該執行個體介紹的是無驗證碼登入操作,但思路是一樣的。而這個demo ,僅僅是為了介紹一下使用cookie 登入的思路,具體項目應用中,這樣是很不方便的。
2、繞過驗證碼登入實戰
接下來,介紹含有驗證碼的登入,當然cookie處理的思路與上介紹的基本一樣
這裡增加了幾點內容:
a、先首次使用驗證碼正確登入並儲存登入前、後的cookie,對比分析cookie,篩選有用的cookie
b、將cookie 寫到yaml 檔案中,方便後續使用cookie登入時直接使用,而不需像上面介紹的那樣,每次都需要先正常登入一樣。
c、使用cookie登入時,從yaml檔案中讀取對應cookie即可。注意:Yaml 檔案操作詳見: Python Yaml 學習 ,有詳細介紹yaml的讀寫操作。
注意:這裡介紹的是先手動輸入驗證碼正確登入後擷取cookie。實際應用中可以使用其他方式擷取cookie
如:1、之前介紹的部落格園登入執行個體:Python - Cookie繞過驗證碼登入 使用fiddler,查看cookie
2、使用瀏覽器查看cookie 如,藉助chrome 外掛程式如,匯出cookie進行分析。
思路如上,代碼如下:
2.1、正常登入擷取有效cookie
# FileName : getLoginCookie.py# Author : Adil# DateTime : 2018/3/20 21:43# SoftWare : PyCharmimport yaml,time,osfrom selenium import webdriverurl = 'https://system.address'driver = webdriver.Chrome()driver.get(url)driver.maximize_window()time.sleep(2)driver.find_element_by_id("username").clear()driver.find_element_by_id("username").send_keys("username")driver.implicitly_wait(5)driver.find_element_by_id("password").clear()driver.find_element_by_id("password").send_keys("password")print("請輸入驗證碼:")# 手動輸入驗證碼security_code = input()time.sleep(1)driver.find_element_by_id("security_code").send_keys(security_code)time.sleep(1)driver.find_element_by_id('sign_btn').click()driver.implicitly_wait(5)# 加一個休眠,這樣得到的cookie 才是登入後的cookie,否則可能列印的還是登入前的cookietime.sleep(5)cookiesAfter = driver.get_cookies()len1 = len(cookiesAfter)# 已經知道需要第幾個cookie,這裡需要第3個cookie,所以選擇cookie下標為2cookie1 = cookiesAfter[2]# 擷取當前檔案所在路徑fileNamePath = os.path.split(os.path.realpath(file))[0]# 拼接config.yaml檔案絕對路徑yamlPath = os.path.join(fileNamePath,'config.yaml')# 以覆蓋寫入開啟檔案fw = open(yamlPath,'w',encoding='utf-8')# 構建資料data = {"cookie1":cookie1}# 裝載寫入yaml檔案。yaml.dump(data,fw)driver.quit()
2.2、讀取cookie設定檔,使用cookie登入系統
# FileName : stlUseCookieLogin.py# Author : Adil# DateTime : 2018/3/20 21:48# SoftWare : PyCharmfrom selenium import webdriverimport time,yaml,osurl = 'https://system.address'driver = webdriver.Chrome()driver.maximize_window()driver.delete_all_cookies()time.sleep(3)driver.get(url)fileNamePath = os.path.split(os.path.realpath(file))[0]yamlPath = os.path.join(fileNamePath,'config.yaml')# 讀取yaml 檔案f = open(yamlPath,'r',encoding='utf-8')cont = f.read()conf = yaml.load(cont)# 讀取cookie值cookie1 = conf.get("cookie1")# 添加cookiedriver.add_cookie(cookie1)print("cookies")print(driver.get_cookies())time.sleep(5)# 這裡重新擷取地址,因為有些系統,未登入狀態,連結會跳轉,這裡就是,登入狀態後,才能正確開啟指定網址,所以這裡要再次指定網址。driver.get(url)# 重新整理查看登入狀態driver.refresh()time.sleep(5)driver.quit()
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
python讀取文本資料並轉化為DataFrame格式的方法詳解
python如何調用API實現智能回複功能