溫馨提示×

溫馨提示×

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

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

Python自動搶火車票的案例

發(fā)布時間:2020-11-20 11:03:46 來源:億速云 閱讀:207 作者:小新 欄目:編程語言

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

我本來想自己寫一個練練手的,但是轉眼一想,Python 本身最大的優(yōu)勢是什么,不就是有很多牛逼的人已經(jīng)造好輪子了嗎?你只需要知道這些輪子并會使用就行了,這樣會節(jié)省你大量的精力和時間,而且站在巨人的肩膀上,會看得更遠。于是我在 github 上一搜索,果然有不少搶票程序,有的是 Python2,有的是 Python3,按 start 數(shù)據(jù)排序,經(jīng)過親自使用和對比,我選擇了一個相對較好用的程序,并稍加以改進和完善。

項目 github 地址:https://github.com/xiaoshun007/12306Python

項目簡介:hack12306.py 是一個 Python 3.x 版的12306.cn自動訂票程序。利用splinter(一個開源的用來通過python自動化測試web的工具),讓電腦自動操作網(wǎng)頁。支持的功能:

(1)支持配置出發(fā)地、目的地、乘車日

(2)支持配置車次類型(動車、高鐵等)

(3)支持配置出發(fā)時間

(4)需要手動輸入登錄驗證碼

(5)支持配置預定車次的選擇順序(使用 order 字段配置,數(shù)字0:從上至下選擇;數(shù)字x(1、2、3、4...):車次從上到下的序號,配           置2表示列表中的第二個車次)

(6)支持預定、購票自動完成

(7)支持配置文件路徑指定

(8)支持席別指定

(9)支持是否允許分配無座

還不支持的功能:

1、郵件提醒

于是,我在此基礎上,加入郵件提醒的功能,并修復一些小 bug,公眾號后臺回復關鍵字【12306】獲取我完善后的搶票程序源碼,再按下方的步驟來操作即可。程序的流程圖如下:

Python自動搶火車票的案例

步驟一、環(huán)境準備

1、安裝 chromedriver

由于程序使用 chrome 瀏覽器,因此需要安裝 chromedriver,其實很簡單,就是下載自己電腦上 chrome 瀏覽器對應的 chromedriver 即可,網(wǎng)上bing 一下就找到了,也可參考之前的文章Python 云端學習 中 chromedriver 的安裝方法。我分享在網(wǎng)盤里 chromedriver 對應的 chrome 瀏覽器版本為 71.0.3578.98,不過也沒有那么嚴格,只要是較新的 chrome 瀏覽器都可以使用我提供的這個 chromedriver 。將 chromedriver 放在一個你想放置的目錄下,這個路徑需要配置在配置文件中。

Python自動搶火車票的案例

2、安裝依賴的 Python 三方庫

安裝自動化工具庫 splinter 和 郵件發(fā)送模塊 zmail 。直接命令行執(zhí)行

pip install splinter
pip install zmail

步驟二、修改配置文件

配置文件 config.ini 需要修改以下幾個地方:

1、你的12306賬號、密碼

## 登陸賬號和密碼
[login]
### username:12306登錄用戶名,必選參數(shù)
username= 填寫你的12306用戶名
### password:12306登錄密碼,必選參數(shù)
password= 填寫你的12306密碼

2、你要買票的始發(fā)站,終點站,日期

## cookie信息,出發(fā)站,目的站
[cookieInfo]
### starts:對應搜索框出發(fā)地,必選參數(shù),請輸入中文名稱,例如:武漢
starts=蘇州
### ends:對應搜索框目的地,必選參數(shù),請輸入中文名稱,例如:南京
ends=信陽
### dtime:對應搜索框出發(fā)日,必選參數(shù),時間格式:年-月-日,例如 2018-01-19
## 時間格式2018-01-19
dtime=2019-02-02

3、你要為其買票的人姓名

## users:乘客姓名,必選參數(shù),中文姓名,支持多個乘客,用英文逗號隔開,例如:張三,李四
### 乘客姓名需要提前加入到登錄的12306賬號的聯(lián)系人中,為了程序自動選擇乘客姓名
[userInfo]
users = 鄭征

4、chromedirver 的路徑

## 路徑信息
[pathInfo]
### driver_name: 瀏覽器名稱,必選參數(shù)
driver_name = chrome
### executable_path: 瀏覽器驅(qū)動路徑,必選參數(shù)
### windows路徑例如:C:\Users\sanshunfeng\Downloads\chromedriver.exe
executable_path = E:\GitHub\python\pachong\tools\chromedriver.exe

5、發(fā)送郵件的配置信息

[mail]
mail_user = 你的郵箱如 :somenzz@163.com
mail_pwd = 你的密碼
receiver = 你的收件地址:如 somenzz@163.com

其他如要買車次類型,幾等座,順序號等參考配置文件的注釋進行修改即可 ,大多數(shù)人使用默認的配置就夠了。

步驟三、運行源代碼

直接在命令行執(zhí)行

python hack12306.py

即可自動讀取配置文件并運行自動搶票程序。

代碼修改說明:

1、手工確認登陸成功。程序在登陸12306網(wǎng)站后,12306可能會跳轉到出現(xiàn)問題的報錯頁面,提示“網(wǎng)絡可能出現(xiàn)問題的頁面”(可能是一種反爬蟲措施),此時程序?qū)⑾萑霟o限等待。為防止此種情況發(fā)生,我這邊將將自動檢查登陸結果的程序替換為手工檢查,點擊驗證碼登陸后,請在命令行界面輸入 “Y”,即可使程序繼續(xù)運行,這個修改是通用的,不論是否跳出網(wǎng)絡錯誤頁面均可運行。

# 驗證碼需要自行輸入,程序自旋等待,直到驗證碼通過,點擊登錄
# 為防止跳轉錯誤頁面陷入死待,此處改為手工確認。
confirm = input("完成驗證:Y/N: ")
if confirm == 'Y' or confirm == 'y':
    return
else:
    #輸入其他值,程序退出
    exit(0)
# while True:
#     if self.driver.url != self.initmy_url:
#         sleep(1)
#     else:
#         break

上述注釋掉的代碼為修改前的代碼。

2、郵件發(fā)送功能。

增加以下函數(shù)發(fā)送提醒郵件。

def sendmail(self,subject,message):
    # 你的郵件內(nèi)容
    mail_content ={
        'subject':subject,  # 郵件標題寫在這
        'content_text':message,  # 郵件正文寫在這
    }
    # 使用你的郵件賬戶名和密碼登錄服務器
    server = zmail.server(self.mail_user, self.mail_pwd)
    # 發(fā)送郵件指令
    server.send_mail([self.receiver], mail_content)

3、調(diào)整等待時間。有些時候由于網(wǎng)絡延遲某些按鈕等元素還未加載出來就被程序發(fā)送了點擊命令,此時會報錯,通過適當延長等待時間可以解決這個問題,就是調(diào)節(jié)代碼中的 time.sleep(n) 中的 n 的值,如下圖所示:

Python自動搶火車票的案例

調(diào)整等待時間

4、運行結果。

程序運行后會自動打開12306的頁面登陸,并自動輸入配置文件中的用戶名和密碼,點擊驗證碼登陸后,在后臺命令窗口輸入Y,然后就可以看到瀏覽器在不停止的查詢余票信息,當有符合條件的車票時將自動下單,并郵件通知。如果第一次運行后報錯了,那么請重試一次,一般第二次就不報錯了。

Python自動搶火車票的案例

后臺打印的信息如下所示:

===========hack12306 begin===========
映射出發(fā)地、目的地...
加載配置文件...
DevTools listening on ws://127.0.0.1:58067/devtools/browser/4426bbf5-49ca-439a-b73e-9217ececf3ea
開始登錄...
等待驗證碼,自行輸入...
完成驗證:Y/N: Y
購票頁面開始...
--------->選擇的車次類型 D-動車
--------->選擇的車次類型 GC-高鐵/城際
--------->選擇的發(fā)車時間 00:00--24:00
循環(huán)點擊查詢... 第 1 次
--------->選擇的車次類型 D-動車
--------->選擇的車次類型 GC-高鐵/城際
--------->選擇的發(fā)車時間 00:00--24:00
循環(huán)點擊查詢... 第 2 次
--------->選擇的車次類型 D-動車
--------->選擇的車次類型 GC-高鐵/城際
--------->選擇的發(fā)車時間 00:00--24:00
循環(huán)點擊查詢... 第 3 次
--------->選擇的車次類型 D-動車
--------->選擇的車次類型 GC-高鐵/城際
--------->選擇的發(fā)車時間 00:00--24:00
循環(huán)點擊查詢... 第 4 次
--------->選擇的車次類型 D-動車
--------->選擇的車次類型 GC-高鐵/城際
--------->選擇的發(fā)車時間 00:00--24:00
循環(huán)點擊查詢... 第 5 次
--------->選擇的車次類型 D-動車
--------->選擇的車次類型 GC-高鐵/城際
--------->選擇的發(fā)車時間 00:00--24:00
循環(huán)點擊查詢... 第 6 次
......

5、關于12306的驗證碼。

這驗證碼可以說是無敵了,連人有時侯都難以分辨。不過仍有人破解這個驗證碼,準確率可以說是相當高了,可以點擊下面的鏈接了解詳情。

https://github.com/andelf/fuck12306

6、生成windows可執(zhí)行程序。

如果你想讓自己的Python程序發(fā)給不懂Python的人使用,還是編譯成 exe 發(fā)給他們好用,省得安裝各種依賴包。這里說下如何將 python 源文件編譯為 exe 文件。工具有很多,坑也很多,不建議過多研究,作為學習者直接運行源代碼妥妥的。這里使用 pyinstaller。先安裝打包工具:

pip install pywin32
pip install PyInstaller

在源代碼所在的目錄下執(zhí)行命令:

pyinstaller -F hack12306.py

等待完成即可在 dist 目錄找到可執(zhí)行的 exe 文件。

如果代碼使用了第三方庫,則需要將第三方庫包也放在源代碼所在的目錄,如本例中的:

Python自動搶火車票的案例

7、附部分源碼:

def selUser(self):
print(u'開始選擇用戶...')
for user in self.users:
self.driver.find_by_text(user).last.click()

def confirmOrder(self):
print(u"選擇席別...")
if self.seatType:
self.driver.find_by_value(self.seatType).click()
else:
print(u"未指定席別,按照12306默認席別")

def submitOrder(self):
print(u"提交訂單...")
sleep(1)
self.driver.find_by_id('submitOrder_id').click()

def confirmSeat(self):
# 若提交訂單異常,請適當加大sleep的時間
sleep(2)
print(u"確認選座...")
if self.driver.find_by_text(u"硬座余票<strong>0</strong>張") == None:
self.driver.find_by_id('qr_submit_id').click()
else:
if self.noseat_allow == 0:
    self.driver.find_by_id('back_edit_id').click()
elif self.noseat_allow == 1:
    self.driver.find_by_id('qr_submit_id').click()

def buyTickets(self):
t = time.clock()
try:
print(u"購票頁面開始...")

# 填充查詢條件
self.preStart()

# 帶著查詢條件,重新加載頁面
self.driver.reload()

# 預定車次算法:根據(jù)order的配置確定開始點擊預訂的車次,0-從上至下點擊,1-第一個車次,2-第二個車次,類推
if self.order != 0:
    # 指定車次預訂
    self.specifyTrainNo()
else:
    # 默認選票
    self.buyOrderZero()
print(u"開始預訂...")

sleep(1)
# 選擇用戶
self.selUser()
# 確認訂單
self.confirmOrder()
# 提交訂單
self.submitOrder()
# 確認選座
self.confirmSeat()
# 發(fā)送郵件
self.sendmail("搶到票了","請及時付款")

print(time.clock() - t)

except Exception as e:
print(e)

關于Python自動搶火車票的案例就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI