Python Selenium Cookie 繞過驗證碼實現登錄
Python Selenium Cookie 繞過驗證碼實現登錄
之前介紹過博客園的通過cookie 繞過驗證碼實現登錄的方法。這裏並不多余,會增加分析和另外一種方法實現登錄。
1、思路介紹
1.1、直接看代碼,內有詳細註釋說明
# FileName : Wm_Cookie_Login.py # Author : Adil # DateTime : 2018/3/20 19:47 # SoftWare : PyCharm from selenium import webdriver import time url = ‘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,否則可能打印的還是登錄前的cookietime.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 : PyCharm import yaml,time,os from selenium import webdriver url = ‘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,否則可能打印的還是登錄前的cookie time.sleep(5) cookiesAfter = driver.get_cookies() len1 = len(cookiesAfter) # 已經知道需要第幾個cookie,這裏需要第3個cookie,所以選擇cookie下標為2 cookie1 = 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 : PyCharm from selenium import webdriver import time,yaml,os url = ‘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") # 添加cookie driver.add_cookie(cookie1) print("cookies") print(driver.get_cookies()) time.sleep(5) # 這裏重新獲取地址,因為有些系統,未登錄狀態,鏈接會跳轉,這裏就是,登錄狀態後,才能正確打開指定網址,所以這裏要再次指定網址。 driver.get(url) # 刷新查看登錄狀態 driver.refresh() time.sleep(5) driver.quit()
以上應該算是已經詳細的介紹了使用cookie 登錄的思路了。有什麽問題可以加群溝通,或是關註微信公眾號,進行溝通。希望對大家有所幫助。
Python Selenium Cookie 繞過驗證碼實現登錄