91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現12306自動搶火車票功能

發布時間:2021-12-29 16:41:17 來源:億速云 閱讀:255 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Python如何實現12306自動搶火車票功能,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、效果展示

在正式進入代碼講解之前,先來看下本文的實現效果。

如果不是為了演示效果,直接在最后確定階段加一個延時點擊確定,應該不到45秒可以鎖定一張票,只要在30分鐘之內付款即可。

二、代碼詳解

本小節會詳細解鎖搶票軟件是如何模擬登錄網站,進行自動買票的。為了更清晰地給大家展示,部分代碼沒有寫成函數,直接裸代碼運行,讓需要買票的朋友可以自己應用軟件進行購票。

1 導入庫

首先導入本文需要加載的庫,如果你有些庫還沒有安裝,導致運行代碼時報錯,可以在Anaconda Prompt中用pip方法安裝。

import json
import time
from captcha import * 
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import wait
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
#導入庫

2 確定好購票基本信息

導入庫后,在python代碼中填寫你購票的基本信息。

purpose = 'ADULT'               #購買成人票,如果是學生票,需調整代碼
names = ['謝朝陽']              #填寫購票人姓名
date = '2021-09-21'             #填寫購票日期
start_station = '深圳'          #購票出發站
end_station = '長沙南'          #購票目的站
password = '11234567xyz'        #登錄12306的秘密
username ='xiezhaoyang122700'   #登錄12306的賬號
trains = ['G1004', 'G80', 'G6028', 'G6182', 'G6016']  #你想買的班次
#填寫基本信息

本文預訂的是2021年9月21日從深圳到長沙南的高鐵票,你可以根據自己的實際需要進行調整。由于有些班次的時間過早或過晚,買了也很不方便,所以可以在trains中挑選出你滿意的班次進行購票。在這里需要提醒大家,我之前在嘗試代碼時碰到的坑,那就是時間中如果有個位數要在前面填0。比如2021年9月2日,你在填寫購票日期date時要寫成'2021-09-02',否則在運行代碼時日期總是填不進去。

3 登錄12306

確定好購票的基本信息后,就可以應用python模擬登錄12306了,代碼如下:

options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")  
browser = webdriver.Chrome(options=options)
browser.maximize_window()
login_url = 'https://kyfw.12306.cn/otn/resources/login.html'
#ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
browser.get(login_url)
time.sleep(0.5)
wait.WebDriverWait(browser, 5).until(EC.element_to_be_clickable((By.CLASS_NAME,'login-hd-account'))).click()
input_name = browser.find_element_by_id('J-userName')
input_pd = browser.find_element_by_id('J-password')
input_name.send_keys(username)
input_pd.send_keys(password)
login = browser.find_element_by_id('J-login')
login.click()
#登錄12306

整體思路是:?

1.應用python模擬調用google瀏覽器;

2.輸入12306網址;

3.等網頁加載完全后點擊賬戶密碼登錄;

4.找到賬號密碼的id,把賬戶密碼信息填充進去;

5.找到登錄id,模擬點擊登錄按鈕。

在這一小節中要注意兩個點。

一、要在python安裝目錄中放和google版本匹配的chromedriver,供python調用。

二、要學會找填寫賬戶密碼信息的id。

首先,在google瀏覽器中輸入12306登錄網址:

https://kyfw.12306.cn/otn/resources/login.html

接著點擊賬戶密碼登錄,會出現如下界面:

Python如何實現12306自動搶火車票功能

然后點擊紅框中的三個點,找到更多工具,點擊開發者工具,會出現如下界面:

Python如何實現12306自動搶火車票功能

點擊紅框中的箭頭,把鼠標移動到賬戶框上去,就會出現如下界面:

Python如何實現12306自動搶火車票功能

右邊變灰的框里就會出現對應的id,點擊賬號框,再把鼠標移動到右邊變灰的字符上去,點擊右鍵,會出現copy element的選項,復制下來即可。

<input type="text" class="input" id="J-userName" placeholder="用戶名/郵箱/手機號"  aria-label="請輸入用戶名/郵箱/手機號" title="請輸入用戶名/郵箱/手機號">

發現了嗎?源代碼input_name中要填寫的browser.find_element_by_id('J-userName')內容,即為id="J-userName"中的信息。

4 模擬滑動滑塊

輸入完用戶名和密碼,點擊立即登錄后,會出現如下滑塊驗證要求。

Python如何實現12306自動搶火車票功能

運行如下代碼即可拖動滑塊進行驗證。

browser.implicitly_wait(5)
print('=====開始處理滑動驗證碼=====')
track = [300, 400, 500]  
for i in track:
    try:
        btn = browser.find_element_by_xpath('//*[@id="nc_1__scale_text"]/span')
        ActionChains(browser).drag_and_drop_by_offset(btn,i,0).perform()
    except:
        time.sleep(2)  
#拉動滑塊驗證

其中,browser.implicitly_wait(5)表示隱性等待5秒,track中放的是滑塊拉動的距離。

5 處理疫情特殊要求

完成滑塊驗證要求后,會出現如下疫情特殊要求提示:

Python如何實現12306自動搶火車票功能

用如下代碼點擊確認即可。

browser.implicitly_wait(5)
browser.find_element_by_xpath('/html/body/div[5]/div[2]/div[3]/a').click()
time.sleep(2)  
#疫情特殊要求

browser.find_element_by_xpath和id的區別是,在右鍵復制時要copy XPath或copy full XPath。

6 點擊購票并填寫出發地、目的地、出發時間

接下來是選擇買票,并將出發地、目的地、出發時間等信息填寫進去。

browser.find_element_by_xpath('//*[@id="J-chepiao"]/a').click()
browser.find_element_by_xpath('//*[@id="megamenu-3"]/div[1]/ul/li[1]/a').click()
browser.find_element_by_xpath('//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()
#選擇買票
def input_info():
    print('=====開始買票=====')
    from_station = browser.find_element_by_xpath('//*[@id="fromStationText"]')
    from_station.send_keys(Keys.ENTER)
    from_station.send_keys(Keys.CONTROL, 'a')
    from_station.send_keys(start_station, Keys.ENTER)
    browser.implicitly_wait(5)
    to_station = browser.find_element_by_xpath('//*[@id="toStationText"]')
    to_station.send_keys(Keys.ENTER)
    to_station.send_keys(Keys.CONTROL, 'a')
    to_station.send_keys(end_station, Keys.ENTER)
    browser.implicitly_wait(5)
    start_date = browser.find_element_by_xpath('//*[@id="train_date"]')
    start_date.send_keys(Keys.ENTER)
    start_date.send_keys(Keys.CONTROL, 'a')
    start_date.send_keys(Keys.CONTROL, 'x')
    start_date.send_keys(date, Keys.ENTER)
    browser.implicitly_wait(5)
    wait.WebDriverWait(browser, 3).until(EC.element_to_be_clickable((By.ID,'query_ticket'))).click()
input_info()
input_info()
#將出發地、目的地、出發日期填進去

得到結果如下:

Python如何實現12306自動搶火車票功能

這里需要注意的是我調用了兩遍input_info函數,因為12306可能采取了一些反爬措施,一遍輸入進去后查不出東西,顯示為灰色。

7 鎖定車票

最后是依次查找trains中的車次是否有票,有的話點擊購買鎖定車票。

trList = browser.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
for tr in trList:
    trainNum = tr.find_element_by_class_name("number").text
    if trainNum in trains:
        leftTicket = tr.find_element_by_xpath(".//td[4]").text
        print('leftTicket', leftTicket)
        if leftTicket == '有' or leftTicket.isdigit():
            orderBtn = tr.find_element_by_class_name("btn72")
            orderBtn.click()
            browser.implicitly_wait(5)
            passengerLabels = browser.find_elements_by_xpath(".//ul[@id='normal_passenger_id']/li/label")
            for passengerLabel in passengerLabels: 
                name = passengerLabel.text
                if name in names: 
                    passengerLabel.click() 
            browser.implicitly_wait(20)
            # 獲取提交按鈕
            submitBtn = browser.find_element_by_id("submitOrder_id")
            submitBtn.click()
            browser.implicitly_wait(20)
            confirmBtn = browser.find_element_by_id("qr_submit_id")
            confirmBtn.click()
            time.sleep(2)
            browser.implicitly_wait(20)
            confirmBtn = browser.find_element_by_id("qr_submit_id")
            confirmBtn.click()
            break 
#依次查找trains中的車次是否有票,有的話點擊購買

關于“Python如何實現12306自動搶火車票功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

响水县| 策勒县| 柏乡县| 共和县| 罗源县| 明光市| 霍林郭勒市| 桦甸市| 翁牛特旗| 泰来县| 遵化市| 铅山县| 盐城市| 锡林浩特市| 天津市| 南溪县| 濉溪县| 鄂托克前旗| 九寨沟县| 桦南县| 东兴市| 江源县| 梅河口市| 曲麻莱县| 庆云县| 财经| 韶山市| 九江市| 北川| 广水市| 新安县| 深泽县| 牡丹江市| 姜堰市| 天津市| 岳普湖县| 临潭县| 大理市| 全椒县| 沧州市| 库尔勒市|