selenium登錄12306_破解滑塊驗證


1. 驅動下載

selenium模擬瀏覽器登錄需要下載對應版本驅動

Firefox驅動:https://github.com/mozilla/geckodriver/releases/

Chrome驅動:http://chromedriver.storage.googleapis.com/index.html

下載對應版本即可, Chrome驅動32位沒關系,可以正常使用的

注意:因為12306會檢測webdriver,所以Firefox新版(88以后)的瀏覽器暫時沒辦法解決這個問題,只能使用Chrome

驅動下載后 可以添加到代碼所在文件夾(executable_path='./chromedriver.exe')或者當前項目的環境文件夾里-python.exe所在文件夾(調用時候不需要+executable_path)

2. 代碼編寫

2.1避免webdriver檢測

import time
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')  # 避免webdriver檢測
browser = webdriver.Chrome(options=options)  # 因為我的chrome.exe在環境目錄里面,所以不用寫 executable_path=’、、、‘

12306會自動檢測webdriver,可以在控制台輸入:

window.navigator.webdriver

查看,未檢出應該是False,只要檢測出(True),則后面的滑塊驗證是無法通過的

2.2 正常獲取網站,此處不多贅述

url = 'https://kyfw.12306.cn/otn/resources/login.html'
browser.get(url=url)
js = 'return window.navigator.webdriver'
print(browser.execute_script(js))   # 可以直接在終端輸出webdriver檢測結果 
# 從頁面直接檢查元素(賬號登陸),然后復制xpath即可獲取到當前按鈕 btn
= browser.find_element_by_xpath('//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[2]/a') btn.click() print(browser.execute_script(js)) time.sleep(2) # 點擊后需要等待1-2秒,確保賬號登錄頁面加載出來。若后面獲取元素失敗,大概率可能是時間不夠動態加載出來 account = browser.find_element_by_xpath('//*[@id="J-userName"]') account.send_keys('phone number') pwd = browser.find_element_by_xpath('//*[@id="J-password"]') pwd.send_keys('password') # 輸入賬號密碼 login = browser.find_element_by_xpath('//*[@id="J-login"]') login.click() 點擊登錄按鈕出現滑塊驗證 print(browser.execute_script(js)) time.sleep(2)

 

代碼里面的三個webdriver檢測輸出為false,說明未被檢測到, OK

2.3 滑塊驗證

 通過查看源碼,手動測試查看出滑塊滑動長度為300px,若一次滑動不通過出現以下頁面,則需點擊刷新,重復以上步驟,所以采用while和try結合

 

 

while True:
    try:
        action = webdriver.ActionChains(browser)  # 利用行為鏈,持續按住並拖拽
        span = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')  # 獲取滑塊
        action.drag_and_drop_by_offset(span, 330, 0).perform()  # 按住並拖動 >300px即可,選用330綽綽有余
        # action.click_and_hold(span).perform()
        # action.move_by_offset(xoffset=300,yoffset=0).perform() 另一張拖動
        action.release()  # 釋放
        print(browser.execute_script(js))
        time.sleep(2)
        a = browser.find_element_by_xpath('//*[@id="nc_1_refresh1"]')  # 查找刷新按鈕,如果沒有說明登錄成功,執行except跳出循環
        a.click()  # 如果剛剛滑動失敗,則點擊刷新,重新滑動
        time.sleep(5)
    except Exception as e:
        print(e)
        break

3 最終驗證通過,結果如下

 

 

 驗證通過啦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM