国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

再不看就晚了,我用Python搶到了回家的火車票!

原創
開發 后端
不知不覺,一年一度的春運搶票大幕已經拉開,想快速搶到回家的車票嗎?作為程序員,這些技術手段,你一定要知道。

【51CTO.com原創稿件】不知不覺,一年一度的春運搶票大幕已經拉開,想快速搶到回家的車票嗎?作為程序員,這些技術手段,你一定要知道。

[[216118]]

為了讓大家更快捷更便利的搶火車票,各種各樣的搶票軟件應需而生,這類軟件大部分都是付費搶票的機制。

作為程序員,如何用技術手段搶到回家的票?來看看用 Python 寫的搶票腳本。

手把手教你用 Python 搶票回家過年

環境介紹

windows 8.1

python3.6.1

firefox插件 geckodriver.exe

操作步驟

引入要的模塊

  1. from selenium import webdriver      #控制瀏覽器 
  2.         from selenium.webdriver.common.keys import Keys  #用于給元素賦值 
  3.         import time   #時間模塊 
  4.         from selenium.webdriver.support.select import Select  #控制下拉框模塊 
  5.         from selenium.webdriver.common.by import By   #尋找元素模塊 
  6.         from selenium.webdriver.support.ui import WebDriverWait  #“顯示等待”模塊 
  7.         from selenium.webdriver.support import expected_conditions as EC  #等待條件模塊 

登陸模塊

首先需要選擇使用的瀏覽器,此處以 firefox 為例,下載:geckodriver.exe 。

下載地址:

https://github.com/mozilla/geckodriver/releases

提到的 stations.txt 可以直接看這個:

車站信息:

https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9042

將 geckodriver.exe 放到 python.exe 同級目錄下即可(如果有報錯的情況下,放一個該文件到與 firefox.exe 同級目錄下,并添加環境變量)

  1. #可以用input,也可以直接放入到后面的用戶名、密碼輸入框中 
  2.        #可以利用標準輸入進行批量的操作,此處以個人搶票操作為例 
  3.        # username = str(input('請輸入你的用戶名:')) 
  4.        # password = str(input('請輸入你的密碼:'))  #這兩行可以暫時忽略 
  5.  
  6.        browser = webdriver.Firefox()      #驅動firefox瀏覽器 
  7.        browser.get("https://kyfw.12306.cn/otn/login/init")    #啟動瀏覽器后進入該鏈接下 
  8.        browser.find_element_by_id('username').clear() 
  9.        browser.find_element_by_id('username').send_keys(‘xxxxx’)    #xxxxx更換為用戶名   
  10.        browser.find_element_by_id('password').send_keys(‘xxxxx’)    #xxxxx更換為密碼    
  11.        time.sleep(10)    #此時驗證碼自行點擊,該處設置10秒延遲,可以自己設置 
  12.        try: 
  13.                browser.find_element_by_id('loginSub').click()     #點擊登陸操作,該id為登陸按鈕 
  14.                #或者 browser.find_element_by_link_text('登陸').click()  #標簽顯示的名稱 
  15.        except
  16.                browser.find_element_by_class_name('touclick-bgimg touclick-reload touclick-reload-normal').click()     #try中驗證碼輸入點錯了會在此處刷新一次 
  17.                time.sleep(20)                     #第二次輸入驗證碼前等待20秒,可以自己設置,第一次輸入無誤直接跳過 
  18.                browser.find_element_by_id('loginSub').click()    #重新輸入驗證碼后的點擊登陸 

跳轉模塊

  1. #默認跳轉到首頁 
  2.         time.sleep(2)    #此處一般無需設置時間等待,調試代碼時使用 
  3.         clickReserve = browser.find_element_by_link_text('車票預訂').click()  #跳轉到車票預定頁面,該頁面可以查詢票 
  4.         time.sleep(2)        #出發地點和到達地點設置 
  5.         #此處value值為出發時刻的地點,BJP表示北京,更改value值在頁面上不加載,基本不耗時間,從頁面中也看不到出發地和目的地 
  6.         #此處內容以爬取,保存在stations.txt中,每行表示一個地址,打開文檔ctrl + F查找即可 
  7.         jsf = 'var a = document.getElementById("fromStation");a.value = "BJP"'    #此處將BJP更換為你需要的出發地址,value值在以爬取到stations.txt中,自行查看 
  8.         browser.execute_script(jsf) 
  9.         jst = 'var a = document.getElementById("toStation");a.value = "LZJ"'   #終點,同上方法 
  10.         browser.execute_script(jst) 
  11.         js = "document.getElementById('train_date').removeAttribute('readonly')"    #時間選擇時默認為只讀,通過JS移除只讀屬性 
  12.         browser.execute_script(js)    #執行JS語句 
  13.         browser.find_element_by_id('train_date').clear()    #時間元素中默認有提示字,需要先清空 
  14.         browser.find_element_by_id('train_date').send_keys('2018-02-01')   #按照改格式輸入需要查詢的時間 
  15.         search = browser.find_element_by_id('query_ticket').click()    #輸入好信息時點擊查詢,該處存在成人票和學生票,默認是成人票,如果購買,對學生票處執行以下語句即可: 
  16.         #browser.find_element_by_id('xxxx').click()    #對于id還是class或其它自行選擇,[可以查看此處](http://blog.51cto.com/12376665/2052278) 

開始購票

此處,就是點擊預定的操作,我在這里只是舉一個方法例子,也可以通過不斷點擊直到成功(這樣可以避免網站倒計時和實際時間的時間差影響,但是不知道 12306 在搶票時對不斷快速訪問有沒有限制)。

  1. start_time = "Thu Jan 04 08:00:00 2018"    #首先設置需要搶票的時間 
  2.        b = time.mktime(time.strptime(start_time,"%a %b %d %H:%M:%S %Y"))        print(time.strftime("%a %b %d %H:%M:%S %Y"time.localtime(b)) )  #此處是為了調試代碼使用,可忽略,不影響使用 
  3.        a = float(b)-time.time()    #利用自己設置的時間減去當前時間的時間戳 
  4.        time.sleep(a)    #上一步驟得出的秒數就是需要等待搶票的時間 
  1. try:     #此處本來有try中的部分就夠了,WebDriverWait已有相應等待重復訪問機制,默認為0.5秒試驗一次,except中添加是為了以防萬一 
  2.     WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "ticket_2400000Z550L")))   #查找需要預定的車次的id,直到出現,10表示共等待10秒 
  3.     ticket = browser.find_element_by_xpath('//tr[@id="ticket_2400000Z550L"]/td[13]/a').click()    #點擊預定按鈕except
  4.     browser.find_element_by_id('query_ticket').click() 
  5.     WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "ticket_2400000Z550L"))) 
  6.     ticket = browser.find_element_by_xpath('//tr[@id="ticket_2400000Z550L"]/td[13]/a').click() 
  1. ""
  2. normalPassenger_8 數字表示該賬號下的第幾位,默認從0開始如果是第一個則為normalPassenger_0 
  3. """WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "normalPassenger_8"))) 
  4. browser.find_element_by_id('normalPassenger_8').click()   #id中的8表示賬號下第九位s = Select(browser.find_element_by_id('seatType_1')) 
  5. s.select_by_value('6')    #此處value值看下方各個種類,6表示高級軟臥browser.find_element_by_id('submitOrder_id').click() 
  6. WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "qr_submit_id"))) 
  7. browser.find_element_by_link_text('提交訂單'
  8. browser.find_element_by_id('qr_submit_id').click()#-------------------------------------------------結束#硬座 1#硬臥 3#軟臥 4#高級軟臥 6#二等座 O(大寫字母)#一等座 M#商務座 9 

總結

需要替換的地方:

  • 用戶名,密碼。
  • 起始地點和目的地的 value 值,查 stations.txt 修改即可。
  • 出發時間。
  • 自己選擇車次的 xpath 路徑,路徑不用變,變對應 id 即可。
  • 勾選用戶的位置(如果只要一個用戶,默認用:normalPassenger_0)。
  • 所選座位類別,默認為有票的類別里最便宜的種類。

其余的在測試中都相同,沒有發現有變化,在使用前,可以測試一下代碼,測試是注意注釋掉提交訂單的代碼(下單有取消限制,每天好像只能取消三次),測試時網速正常。

有人說用瀏覽器執行速度會慢,確實對于可以直接識別驗證碼的腳本而言,沒有界面的會更快一些,但是實際上所用時間為預定開始到結束,相同網絡下,代碼執行時間是要快于人工操作的,

另外,時間可以研究一下,之前研究過某寶的時間,秒殺時間是要比北京時間提前一點幾秒的,感覺全國各地有微小時間差的。

完整腳本示例

  1. #python3.6.1#data:2018-01-03#author:LGC247CG""
  2. 說明: 
  3. 1.該腳本主要是提供一個實現思路,實現方法有很多,可以優化的地方也有很多,觸發機制也可以自己設置,代碼以壓縮到最短,只是為了讓大家都可以看明白 
  4. 2.正常網絡狀況下,不設置指定時間時,從點擊確認驗證碼到下單基本上1秒左右,所以速度上還是沒問題的 
  5. 3.由于同時勾選多人和單人使用所需時間基本相同,希望該方法只用于技術交流,請勿作為黃牛使用 
  6. 4.在作為技術交流的情況下,如果驗證碼可以實現將可以完全實現自動搶票: 
  7. --1>驗證碼有一定規律和數量,可以利用腳本獲取所有圖片,并加上相應標簽 
  8. --2>將頁面的文字和標簽相匹配,再將圖片進行相似度計算,對對應圖片進行點擊操作 
  9. --3>或是訓練深度學習的圖片識別模型,通過算法識別 
  10. """from selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport timefrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC 
  11.  
  12. browser = webdriver.Firefox() 
  13. browser.get("https://kyfw.12306.cn/otn/login/init"
  14. browser.find_element_by_id('username').clear() 
  15. browser.find_element_by_id('username').send_keys('xxxxxxx'
  16. browser.find_element_by_id('password').send_keys('xxxxxxx'
  17. time.sleep(10)try: 
  18.     browser.find_element_by_id('loginSub').click()except
  19.     browser.find_element_by_class_name('touclick-bgimg touclick-reload touclick-reload-normal').click() 
  20.     time.sleep(15) 
  21.     browser.find_element_by_id('loginSub').click()#跳轉到車票預定頁面time.sleep(2) 
  22. clickReserve = browser.find_element_by_link_text('車票預訂').click()#出發地點和到達地點設置WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "fromStation"))) 
  23. jsf = 'var a = document.getElementById("fromStation");a.value = "BJP"'browser.execute_script(jsf) 
  24. jst = 'var a = document.getElementById("toStation");a.value = "LZJ"'browser.execute_script(jst) 
  25. js = "document.getElementById('train_date').removeAttribute('readonly')"browser.execute_script(js) 
  26. browser.find_element_by_id('train_date').clear() 
  27. browser.find_element_by_id('train_date').send_keys('2018-02-02'
  28. search = browser.find_element_by_id('query_ticket').click()#對于時間,我一直覺得網站計算的時間和自己獲取的時間差一秒左右,這個根據不同環境自己測試start_time = "Thu Jan 04 10:00:00 2018"    #首先設置需要搶票的時間b = time.mktime(time.strptime(start_time,"%a %b %d %H:%M:%S %Y")) 
  29. print(time.strftime("%a %b %d %H:%M:%S %Y"time.localtime(b)) )  #此處是為了調試代碼使用,可忽略,不影響使用a = float(b)-time.time()    #利用自己設置的時間減去當前時間的時間戳time.sleep(a)    #上一步驟得出的秒數就是需要等待搶票的時間browser.find_element_by_id('query_ticket').click()    #時間到了先點擊查詢刷新一下,以防找不到元素try: 
  30.     WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "ticket_2400000Z550L"))) 
  31.     ticket = browser.find_element_by_xpath('//tr[@id="ticket_2400000Z550L"]/td[13]/a').click()except
  32.     browser.find_element_by_id('query_ticket').click() 
  33.     WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "ticket_250000K8880L"))) 
  34.     ticket = browser.find_element_by_xpath('//tr[@id="ticket_250000K8880L"]/td[13]/a').click()""
  35. normalPassenger_8 數字表示該賬號下的第幾位,默認從0開始如果是第一個則為normalPassenger_0 
  36. """WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "normalPassenger_8"))) 
  37. browser.find_element_by_id('normalPassenger_8').click() 
  38. s = Select(browser.find_element_by_id('seatType_1')) 
  39. s.select_by_value('6'
  40. browser.find_element_by_id('submitOrder_id').click() 
  41. WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "qr_submit_id"))) 
  42. browser.find_element_by_link_text('提交訂單')#browser.find_element_by_id('qr_submit_id').click() 

作者:LGC247CG

簡介:大學時候就已經接觸 Python,并研究 Python 爬蟲,數據分析,文本處理,圖像處理等,有五年應用經驗,工作以后主要用在 Linux 系統運維腳本。

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2019-12-26 17:07:30

Python程序員GitHub

2019-12-23 10:51:40

Python車票搶票

2018-12-29 16:24:58

Python12306火車票

2018-09-27 05:31:14

2020-12-18 08:55:20

Python火車票代碼

2024-01-30 08:55:24

2018-01-02 09:56:04

Python12306火車票

2015-02-11 19:39:16

114啦機票頻道

2016-08-31 13:26:24

PythonPython3工具

2018-01-10 22:19:44

2021-12-14 15:30:02

數字化企業轉型運營商轉型

2024-06-20 13:44:48

OpenAIV2A模型

2011-01-24 15:37:32

火車票

2017-08-29 09:29:19

編程語言薪資

2012-01-05 13:14:42

火車票

2023-09-15 09:34:54

2011-01-28 15:48:11

Chrome插件Page Monito火車票

2018-10-22 15:20:19

Python火車票查看器編程語言

2023-07-07 14:18:57

攜程實踐

2012-11-15 09:40:18

點贊
收藏

51CTO技術棧公眾號

中文字幕久久一区| 国产成人aaa| 欧美久久在线观看| 精品久久人人做人人爱| 欧美先锋影音| 中文字幕在线观看第一页| 亚洲精品综合精品自拍| 国产91porn| 国产电影一区在线| 国产第一页在线| 欧美在线一二三区| 666欧美在线视频| 国产美女一区| 69视频在线| 国产精品二区二区三区| 亚洲综合一区在线| 神马久久影院| 免费福利影院| 国产精品高潮呻吟久久av无限 | 国产亚洲欧美aaaa| 国产精品一品二品| 24小时免费看片在线观看| 免费成人深夜夜行视频| 91福利视频久久久久| 中文字幕一区综合| 久久精品欧美一区二区三区不卡| 四虎精品一区二区免费| 日韩在线第三页| 91高清视频在线免费观看| 亚洲天堂av一区| 日韩一区电影| 国产高清在线看| 日韩av影视| 国产亚洲视频中文字幕视频| 久久久久久久久久久久久女国产乱| 7777精品| 国产剧情演绎av| 91美女高潮出水| 宅男噜噜噜66一区二区66| 蜜桃视频在线观看一区二区| 成人日韩av| ts人妖交友网站| 91精品在线播放| 91精品国产色综合久久久蜜香臀| 久久一综合视频| 日韩成人av电影| 亚洲人成电影在线观看天堂色| 国产一区二区视频在线看| 欧美性猛交xxx乱久交| 国产91网红主播在线观看| 日韩欧美国产高清91| 三级亚洲高清视频| 久久99国产精品二区高清软件| 亚洲老女人av| 91手机在线播放| 亚洲国产天堂久久国产91 | 免费久久99精品国产| 日韩欧美一区二区三区在线观看| 久久久精品麻豆| 5566中文字幕一区二区| 亚洲国产精品视频在线观看| 国产亚洲综合色| 中文字幕一区二区三三| 中文在线免费视频| 高清hd写真福利在线播放| 久久精品日韩精品| 久久久精品在线| 精品久久久久久中文字幕| 美美哒免费高清在线观看视频一区二区| 日韩一区二区三区四区五区 | 国产在线看一区| 成人h动漫免费观看网站 | 国产精品嫩草视频| 日韩精品一区二区三区视频播放| www亚洲一区| 欧美另类综合| 久久精品黄色| 欧美xxx.com| 男人添女人下面高潮视频| 成人午夜黄色影院| 国产欧美一区二区精品忘忧草| 亚洲成人三区| 美女写真久久影院| 一个人看的www一区| 九一免费在线观看| 国产色视频一区| 在线电影中文日韩| 欧美性猛交xxxx乱大交3| 成人免费看视频| 亚洲影视一区二区三区| 四虎精品永久免费| 在线中文字幕电影| 欧美r片在线| 日本阿v视频在线观看| 国产精品永久免费视频| 国产亚洲精品激情久久| 在线观看视频一区二区| 国产欧美一区二区三区网站| 日韩成人免费电影| 久久久久久免费视频| 亚洲精品三区| 国产在线观看av| 男女18免费网站视频| av在线观看地址| 久久超碰亚洲| 日韩美女激情视频| 在线成人激情黄色| 精品视频国产| 欧美极品欧美精品欧美图片| 国产传媒一区| 奇米4444一区二区三区| 亚洲欧洲xxxx| 欧美日韩一卡二卡| 亚洲精品美腿丝袜| zzijzzij亚洲日本少妇熟睡| 国产精品视区| 国产精品99一区二区三| 91精品入口| avav成人| 蜜桃麻豆av在线| 久操视频在线观看| 日夜干在线视频| 4hu永久免费入口| 久久久久久久久久久福利| 最新av在线免费观看| 国产成人精品福利一区二区三区| 热re91久久精品国99热蜜臀| 久久精品美女视频网站| 亚洲精品美女免费| 影音先锋欧美激情| av黄色免费| 国产91对白刺激露脸在线观看| 欧美国产综合视频| 91嫩草在线| 国产精品久久电影观看| 久久久久久久久久久免费精品| 国产午夜精品全部视频播放| 精品日韩99亚洲| 7777精品伊人久久久大香线蕉超级流畅| 亚洲成精国产精品女| 亚洲欧美一区二区三区极速播放| 久久久久综合网| 99久久精品国产一区| 国产一区在线观看视频| 免费看黄色91| 精品一区二区三区av| 日韩精品电影一区亚洲| 噜噜噜久久亚洲精品国产品小说| 韩国在线视频一区| 黄色欧美日韩| 1024精品一区二区三区| 欧美日本免费| 91成人国产| 日韩精品一区二区三区免费观看| 国产一区二区三区四区| 先锋影音男人资源| 久久久久久久久久久av| 欧美人与性动交a欧美精品| 另类色图亚洲色图| 欧美大码xxxx| 欧美激情免费看| 性欧美亚洲xxxx乳在线观看| 97在线视频国产| 欧美孕妇性xx| 国产精品久久久久999| 国产欧美日韩免费| 成人国产亚洲精品a区天堂华泰| 成人黄色av网| 国产精品国模大尺度私拍| 久久精品成人一区二区三区蜜臀| 精品国产免费一区二区三区| 久久人人九九| 一区二区三区四区五区精品| 成人av午夜电影| 国产a亚洲精品| 午夜精品成人av| 视频精品导航| 国产一区二区三区免费观看在线 | 国产成人精品一区二| 国产成人精品免费看| 99re8在线精品视频免费播放| 26uuu精品一区二区在线观看| 亚洲欧洲另类国产综合| 一本综合久久| 日韩不卡在线观看日韩不卡视频| 美女一区二区久久| 成人久久视频在线观看| 欧美极品美女视频| 亚洲成人精品一区二区| 欧美日韩三级一区| 日韩黄色av网站| 久久电影一区二区| 国产成人精品免费久久久久| 成人精品水蜜桃| 伊人久久大香线蕉成人综合网| 丰满少妇久久久| 国产黄色高清在线| av在线播放av| 久久男人天堂| 风间由美中文字幕在线看视频国产欧美 |