您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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】獲取我完善后的搶票程序源碼,再按下方的步驟來操作即可。程序的流程圖如下:
步驟一、環(huán)境準備
1、安裝 chromedriver
由于程序使用 chrome 瀏覽器,因此需要安裝 chromedriver,其實很簡單,就是下載自己電腦上 chrome 瀏覽器對應的 chromedriver 即可,網(wǎng)上bing 一下就找到了,也可參考之前的文章Python 云端學習 中 chromedriver 的安裝方法。我分享在網(wǎng)盤里 chromedriver 對應的 chrome 瀏覽器版本為 71.0.3578.98,不過也沒有那么嚴格,只要是較新的 chrome 瀏覽器都可以使用我提供的這個 chromedriver 。將 chromedriver 放在一個你想放置的目錄下,這個路徑需要配置在配置文件中。
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 的值,如下圖所示:
調(diào)整等待時間
4、運行結果。
程序運行后會自動打開12306的頁面登陸,并自動輸入配置文件中的用戶名和密碼,點擊驗證碼登陸后,在后臺命令窗口輸入Y,然后就可以看到瀏覽器在不停止的查詢余票信息,當有符合條件的車票時將自動下單,并郵件通知。如果第一次運行后報錯了,那么請重試一次,一般第二次就不報錯了。
后臺打印的信息如下所示:
===========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 文件。
如果代碼使用了第三方庫,則需要將第三方庫包也放在源代碼所在的目錄,如本例中的:
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)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。