利用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()

 

Tags: