日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
再不看就晚了,我用Python搶到了回家的火車(chē)票!

【稿件】不知不覺(jué),一年一度的春運(yùn)搶票大幕已經(jīng)拉開(kāi),想快速搶到回家的車(chē)票嗎?作為程序員,這些技術(shù)手段,你一定要知道。

創(chuàng)新互聯(lián)建站秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營(yíng)銷(xiāo)的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,微信小程序,網(wǎng)頁(yè)設(shè)計(jì)制作,手機(jī)網(wǎng)站制作設(shè)計(jì),營(yíng)銷(xiāo)型網(wǎng)站建設(shè)幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長(zhǎng)。

為了讓大家更快捷更便利的搶火車(chē)票,各種各樣的搶票軟件應(yīng)需而生,這類軟件大部分都是付費(fèi)搶票的機(jī)制。

作為程序員,如何用技術(shù)手段搶到回家的票?來(lái)看看用 Python 寫(xiě)的搶票腳本。

手把手教你用 Python 搶票回家過(guò)年

環(huán)境介紹

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   #時(shí)間模塊 
  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 可以直接看這個(gè):

車(chē)站信息:

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

將 geckodriver.exe 放到 python.exe 同級(jí)目錄下即可(如果有報(bào)錯(cuò)的情況下,放一個(gè)該文件到與 firefox.exe 同級(jí)目錄下,并添加環(huán)境變量)

 
 
 
 
  1. #可以用input,也可以直接放入到后面的用戶名、密碼輸入框中 
  2.        #可以利用標(biāo)準(zhǔn)輸入進(jìn)行批量的操作,此處以個(gè)人搶票操作為例 
  3.        # username = str(input('請(qǐng)輸入你的用戶名:')) 
  4.        # password = str(input('請(qǐng)輸入你的密碼:'))  #這兩行可以暫時(shí)忽略 
  5.  
  6.        browser = webdriver.Firefox()      #驅(qū)動(dòng)firefox瀏覽器 
  7.        browser.get("https://kyfw.12306.cn/otn/login/init")    #啟動(dòng)瀏覽器后進(jìn)入該鏈接下 
  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)    #此時(shí)驗(yàn)證碼自行點(diǎn)擊,該處設(shè)置10秒延遲,可以自己設(shè)置 
  12.        try: 
  13.                browser.find_element_by_id('loginSub').click()     #點(diǎn)擊登陸操作,該id為登陸按鈕 
  14.                #或者 browser.find_element_by_link_text('登陸').click()  #標(biāo)簽顯示的名稱 
  15.        except: 
  16.                browser.find_element_by_class_name('touclick-bgimg touclick-reload touclick-reload-normal').click()     #try中驗(yàn)證碼輸入點(diǎn)錯(cuò)了會(huì)在此處刷新一次 
  17.                time.sleep(20)                     #第二次輸入驗(yàn)證碼前等待20秒,可以自己設(shè)置,第一次輸入無(wú)誤直接跳過(guò) 
  18.                browser.find_element_by_id('loginSub').click()    #重新輸入驗(yàn)證碼后的點(diǎn)擊登陸 

跳轉(zhuǎn)模塊

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

開(kāi)始購(gòu)票

此處,就是點(diǎn)擊預(yù)定的操作,我在這里只是舉一個(gè)方法例子,也可以通過(guò)不斷點(diǎn)擊直到成功(這樣可以避免網(wǎng)站倒計(jì)時(shí)和實(shí)際時(shí)間的時(shí)間差影響,但是不知道 12306 在搶票時(shí)對(duì)不斷快速訪問(wèn)有沒(méi)有限制)。

 
 
 
 
  1. start_time = "Thu Jan 04 08:00:00 2018"    #首先設(shè)置需要搶票的時(shí)間 
  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)) )  #此處是為了調(diào)試代碼使用,可忽略,不影響使用 
  3.        a = float(b)-time.time()    #利用自己設(shè)置的時(shí)間減去當(dāng)前時(shí)間的時(shí)間戳 
  4.        time.sleep(a)    #上一步驟得出的秒數(shù)就是需要等待搶票的時(shí)間 
 
 
 
 
  1. try:     #此處本來(lái)有try中的部分就夠了,WebDriverWait已有相應(yīng)等待重復(fù)訪問(wèn)機(jī)制,默認(rèn)為0.5秒試驗(yàn)一次,except中添加是為了以防萬(wàn)一 
  2.     WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID, "ticket_2400000Z550L")))   #查找需要預(yù)定的車(chē)次的id,直到出現(xiàn),10表示共等待10秒 
  3.     ticket = browser.find_element_by_xpath('//tr[@id="ticket_2400000Z550L"]/td[13]/a').click()    #點(diǎn)擊預(yù)定按鈕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 數(shù)字表示該賬號(hào)下的第幾位,默認(rèn)從0開(kāi)始如果是第一個(gè)則為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表示賬號(hào)下第九位s = Select(browser.find_element_by_id('seatType_1')) 
  5. s.select_by_value('6')    #此處value值看下方各個(gè)種類,6表示高級(jí)軟臥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()#-------------------------------------------------結(jié)束#硬座 1#硬臥 3#軟臥 4#高級(jí)軟臥 6#二等座 O(大寫(xiě)字母)#一等座 M#商務(wù)座 9 

總結(jié)

需要替換的地方:

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

其余的在測(cè)試中都相同,沒(méi)有發(fā)現(xiàn)有變化,在使用前,可以測(cè)試一下代碼,測(cè)試是注意注釋掉提交訂單的代碼(下單有取消限制,每天好像只能取消三次),測(cè)試時(shí)網(wǎng)速正常。

有人說(shuō)用瀏覽器執(zhí)行速度會(huì)慢,確實(shí)對(duì)于可以直接識(shí)別驗(yàn)證碼的腳本而言,沒(méi)有界面的會(huì)更快一些,但是實(shí)際上所用時(shí)間為預(yù)定開(kāi)始到結(jié)束,相同網(wǎng)絡(luò)下,代碼執(zhí)行時(shí)間是要快于人工操作的,

另外,時(shí)間可以研究一下,之前研究過(guò)某寶的時(shí)間,秒殺時(shí)間是要比北京時(shí)間提前一點(diǎn)幾秒的,感覺(jué)全國(guó)各地有微小時(shí)間差的。

完整腳本示例

 
 
 
 
  1. #python3.6.1#data:2018-01-03#author:LGC247CG""" 
  2. 說(shuō)明: 
  3. 1.該腳本主要是提供一個(gè)實(shí)現(xiàn)思路,實(shí)現(xiàn)方法有很多,可以優(yōu)化的地方也有很多,觸發(fā)機(jī)制也可以自己設(shè)置,代碼以壓縮到最短,只是為了讓大家都可以看明白 
  4. 2.正常網(wǎng)絡(luò)狀況下,不設(shè)置指定時(shí)間時(shí),從點(diǎn)擊確認(rèn)驗(yàn)證碼到下單基本上1秒左右,所以速度上還是沒(méi)問(wèn)題的 
  5. 3.由于同時(shí)勾選多人和單人使用所需時(shí)間基本相同,希望該方法只用于技術(shù)交流,請(qǐng)勿作為黃牛使用 
  6. 4.在作為技術(shù)交流的情況下,如果驗(yàn)證碼可以實(shí)現(xiàn)將可以完全實(shí)現(xiàn)自動(dòng)搶票: 
  7. --1>驗(yàn)證碼有一定規(guī)律和數(shù)量,可以利用腳本獲取所有圖片,并加上相應(yīng)標(biāo)簽 
  8. --2>將頁(yè)面的文字和標(biāo)簽相匹配,再將圖片進(jìn)行相似度計(jì)算,對(duì)對(duì)應(yīng)圖片進(jìn)行點(diǎn)擊操作 
  9. --3>或是訓(xùn)練深度學(xué)習(xí)的圖片識(shí)別模型,通過(guò)算法識(shí)別 
  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()#跳轉(zhuǎn)到車(chē)票預(yù)定頁(yè)面time.sleep(2) 
  22. clickReserve = browser.find_element_by_link_text('車(chē)票預(yù)訂').click()#出發(fā)地點(diǎn)和到達(dá)地點(diǎn)設(shè)置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()#對(duì)于時(shí)間,我一直覺(jué)得網(wǎng)站計(jì)算的時(shí)間和自己獲取的時(shí)間差一秒左右,這個(gè)根據(jù)不同環(huán)境自己測(cè)試start_time = "Thu Jan 04 10:00:00 2018"    #首先設(shè)置需要搶票的時(shí)間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)) )  #此處是為了調(diào)試代碼使用,可忽略,不影響使用a = float(b)-time.time()    #利用自己設(shè)置的時(shí)間減去當(dāng)前時(shí)間的時(shí)間戳time.sleep(a)    #上一步驟得出的秒數(shù)就是需要等待搶票的時(shí)間browser.find_element_by_id('query_ticket').click()    #時(shí)間到了先點(diǎn)擊查詢刷新一下,以防找不到元素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 數(shù)字表示該賬號(hào)下的第幾位,默認(rèn)從0開(kāi)始如果是第一個(gè)則為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

簡(jiǎn)介:大學(xué)時(shí)候就已經(jīng)接觸 Python,并研究 Python 爬蟲(chóng),數(shù)據(jù)分析,文本處理,圖像處理等,有五年應(yīng)用經(jīng)驗(yàn),工作以后主要用在 Linux 系統(tǒng)運(yùn)維腳本。

【原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為.com】


標(biāo)題名稱:再不看就晚了,我用Python搶到了回家的火車(chē)票!
URL標(biāo)題:http://www.5511xx.com/article/dpciped.html