利用Python與selenium自動化模擬登陸12306官網!
- 2019 年 10 月 4 日
- 筆記
近年來,12306的反爬越來越來嚴重,從一年前的 獲取tk參數後到現在增加了 JS、CSS等加密方式!
目前大部分人利用的登陸方式都是利用selenium ,此文也不例外。
環境:
Windows
python 3.6.5
模組:
selenium
pyautogui
time
第一步:
實例化一款瀏覽器,並進入到12306官網

driver = webdriver.Chrome() driver.get('https://kyfw.12306.cn/otn/resources/login.html') driver.implicitly_wait(10) driver.maximize_window()
第二步:
點擊帳號登陸
driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]').click()

第三步:
在輸入框中,模擬輸入帳號密碼:
driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('123456') driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('123456')

第四步:
當帳號密碼輸入完畢後,我們應該要做的就是 模擬點擊驗證碼圖片了!
那麼首先把圖片下載下來:
yzm_code = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div[2]/div[3]/div') yzm_code.screenshot('yzm.png')

第五步:
驗證碼下載下來後就可以為所欲為了,不管是對接打碼平台也好,自己訓練模型,或者利用程式碼模擬點擊也是可以的!
前面兩種方法根本沒法講,所以這裡採用第三種方式,進行模擬點擊。
在這裡 說說我們需要達到的效果,驗證碼上總共有8張圖,那麼我想達到的效果就是我輸入1,2,3那麼程式自動點擊1,2,3三張圖片。
所以我們先獲取到每個圖片的中心點坐標,這裡是有規律的,聰明人肯定一看就懂了。
我這裡這個是隨便寫的:
code = input('請輸入驗證碼:') time.sleep(5) point_map = { '1': '40,45', '2': '116,53', '4': '257,50', '5': '40,121', '6': '116,133', '3': '185,52', '7': '185,132', '8': '257,130' }
def get_point(indexs): indexs = indexs.split(',') temp = [] for index in indexs: temp.append(point_map[index]) print(temp) return temp temp = get_point(code)
這兩串程式碼就不解釋了,很基礎的東西。
最終的效果就是 輸入1,2 那麼得到的是一個列表:
[ '40,45','116,53']
記住,這個坐標只是 驗證碼圖片上的坐標,不是整個螢幕的全局坐標!!!!
那麼如何取全局坐標?驗證碼頂點(1206,428)+驗證碼的坐標,即全局坐標!這裡的 (1206,428)請自行測試!

第六步:
模擬點擊,利用到pyautogui這個模組。切記,利用此模組前一定要加延遲進行畫面切換。
(此文只做方法學習,並沒有任何其它意思,正常情況都是對接打碼平台!希望大家能學以致用,在其它的編程過程中用的到這些方法!)
for i in temp: indexs = i.split(',') x = int(indexs[0]) y = int(indexs[1]) pyautogui.click(1206+x, 428+y)
最後點擊登錄即可!
driver.find_element_by_xpath('//*[@id="J-login"]').click()