您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python自動搶火車票的案例,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
我本來想自己寫一個練練手的,但是轉眼一想,Python 本身最大的優勢是什么,不就是有很多牛逼的人已經造好輪子了嗎?你只需要知道這些輪子并會使用就行了,這樣會節省你大量的精力和時間,而且站在巨人的肩膀上,會看得更遠。于是我在 github 上一搜索,果然有不少搶票程序,有的是 Python2,有的是 Python3,按 start 數據排序,經過親自使用和對比,我選擇了一個相對較好用的程序,并稍加以改進和完善。
項目 github 地址:https://github.com/xiaoshun007/12306Python
項目簡介:hack12306.py 是一個 Python 3.x 版的12306.cn自動訂票程序。利用splinter(一個開源的用來通過python自動化測試web的工具),讓電腦自動操作網頁。支持的功能:
(1)支持配置出發地、目的地、乘車日
(2)支持配置車次類型(動車、高鐵等)
(3)支持配置出發時間
(4)需要手動輸入登錄驗證碼
(5)支持配置預定車次的選擇順序(使用 order 字段配置,數字0:從上至下選擇;數字x(1、2、3、4...):車次從上到下的序號,配 置2表示列表中的第二個車次)
(6)支持預定、購票自動完成
(7)支持配置文件路徑指定
(8)支持席別指定
(9)支持是否允許分配無座
還不支持的功能:
1、郵件提醒
于是,我在此基礎上,加入郵件提醒的功能,并修復一些小 bug,公眾號后臺回復關鍵字【12306】獲取我完善后的搶票程序源碼,再按下方的步驟來操作即可。程序的流程圖如下:
步驟一、環境準備
1、安裝 chromedriver
由于程序使用 chrome 瀏覽器,因此需要安裝 chromedriver,其實很簡單,就是下載自己電腦上 chrome 瀏覽器對應的 chromedriver 即可,網上bing 一下就找到了,也可參考之前的文章Python 云端學習 中 chromedriver 的安裝方法。我分享在網盤里 chromedriver 對應的 chrome 瀏覽器版本為 71.0.3578.98,不過也沒有那么嚴格,只要是較新的 chrome 瀏覽器都可以使用我提供的這個 chromedriver 。將 chromedriver 放在一個你想放置的目錄下,這個路徑需要配置在配置文件中。
2、安裝依賴的 Python 三方庫
安裝自動化工具庫 splinter 和 郵件發送模塊 zmail 。直接命令行執行
pip install splinter pip install zmail
步驟二、修改配置文件
配置文件 config.ini 需要修改以下幾個地方:
1、你的12306賬號、密碼
## 登陸賬號和密碼 [login] ### username:12306登錄用戶名,必選參數 username= 填寫你的12306用戶名 ### password:12306登錄密碼,必選參數 password= 填寫你的12306密碼
2、你要買票的始發站,終點站,日期
## cookie信息,出發站,目的站 [cookieInfo] ### starts:對應搜索框出發地,必選參數,請輸入中文名稱,例如:武漢 starts=蘇州 ### ends:對應搜索框目的地,必選參數,請輸入中文名稱,例如:南京 ends=信陽 ### dtime:對應搜索框出發日,必選參數,時間格式:年-月-日,例如 2018-01-19 ## 時間格式2018-01-19 dtime=2019-02-02
3、你要為其買票的人姓名
## users:乘客姓名,必選參數,中文姓名,支持多個乘客,用英文逗號隔開,例如:張三,李四 ### 乘客姓名需要提前加入到登錄的12306賬號的聯系人中,為了程序自動選擇乘客姓名 [userInfo] users = 鄭征
4、chromedirver 的路徑
## 路徑信息 [pathInfo] ### driver_name: 瀏覽器名稱,必選參數 driver_name = chrome ### executable_path: 瀏覽器驅動路徑,必選參數 ### windows路徑例如:C:\Users\sanshunfeng\Downloads\chromedriver.exe executable_path = E:\GitHub\python\pachong\tools\chromedriver.exe
5、發送郵件的配置信息
[mail] mail_user = 你的郵箱如 :somenzz@163.com mail_pwd = 你的密碼 receiver = 你的收件地址:如 somenzz@163.com
其他如要買車次類型,幾等座,順序號等參考配置文件的注釋進行修改即可 ,大多數人使用默認的配置就夠了。
步驟三、運行源代碼
直接在命令行執行
python hack12306.py
即可自動讀取配置文件并運行自動搶票程序。
代碼修改說明:
1、手工確認登陸成功。程序在登陸12306網站后,12306可能會跳轉到出現問題的報錯頁面,提示“網絡可能出現問題的頁面”(可能是一種反爬蟲措施),此時程序將陷入無限等待。為防止此種情況發生,我這邊將將自動檢查登陸結果的程序替換為手工檢查,點擊驗證碼登陸后,請在命令行界面輸入 “Y”,即可使程序繼續運行,這個修改是通用的,不論是否跳出網絡錯誤頁面均可運行。
# 驗證碼需要自行輸入,程序自旋等待,直到驗證碼通過,點擊登錄 # 為防止跳轉錯誤頁面陷入死待,此處改為手工確認。 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、郵件發送功能。
增加以下函數發送提醒郵件。
def sendmail(self,subject,message): # 你的郵件內容 mail_content ={ 'subject':subject, # 郵件標題寫在這 'content_text':message, # 郵件正文寫在這 } # 使用你的郵件賬戶名和密碼登錄服務器 server = zmail.server(self.mail_user, self.mail_pwd) # 發送郵件指令 server.send_mail([self.receiver], mail_content)
3、調整等待時間。有些時候由于網絡延遲某些按鈕等元素還未加載出來就被程序發送了點擊命令,此時會報錯,通過適當延長等待時間可以解決這個問題,就是調節代碼中的 time.sleep(n) 中的 n 的值,如下圖所示:
調整等待時間
4、運行結果。
程序運行后會自動打開12306的頁面登陸,并自動輸入配置文件中的用戶名和密碼,點擊驗證碼登陸后,在后臺命令窗口輸入Y,然后就可以看到瀏覽器在不停止的查詢余票信息,當有符合條件的車票時將自動下單,并郵件通知。如果第一次運行后報錯了,那么請重試一次,一般第二次就不報錯了。
后臺打印的信息如下所示:
===========hack12306 begin=========== 映射出發地、目的地... 加載配置文件... DevTools listening on ws://127.0.0.1:58067/devtools/browser/4426bbf5-49ca-439a-b73e-9217ececf3ea 開始登錄... 等待驗證碼,自行輸入... 完成驗證:Y/N: Y 購票頁面開始... --------->選擇的車次類型 D-動車 --------->選擇的車次類型 GC-高鐵/城際 --------->選擇的發車時間 00:00--24:00 循環點擊查詢... 第 1 次 --------->選擇的車次類型 D-動車 --------->選擇的車次類型 GC-高鐵/城際 --------->選擇的發車時間 00:00--24:00 循環點擊查詢... 第 2 次 --------->選擇的車次類型 D-動車 --------->選擇的車次類型 GC-高鐵/城際 --------->選擇的發車時間 00:00--24:00 循環點擊查詢... 第 3 次 --------->選擇的車次類型 D-動車 --------->選擇的車次類型 GC-高鐵/城際 --------->選擇的發車時間 00:00--24:00 循環點擊查詢... 第 4 次 --------->選擇的車次類型 D-動車 --------->選擇的車次類型 GC-高鐵/城際 --------->選擇的發車時間 00:00--24:00 循環點擊查詢... 第 5 次 --------->選擇的車次類型 D-動車 --------->選擇的車次類型 GC-高鐵/城際 --------->選擇的發車時間 00:00--24:00 循環點擊查詢... 第 6 次 ......
5、關于12306的驗證碼。
這驗證碼可以說是無敵了,連人有時侯都難以分辨。不過仍有人破解這個驗證碼,準確率可以說是相當高了,可以點擊下面的鏈接了解詳情。
https://github.com/andelf/fuck12306
6、生成windows可執行程序。
如果你想讓自己的Python程序發給不懂Python的人使用,還是編譯成 exe 發給他們好用,省得安裝各種依賴包。這里說下如何將 python 源文件編譯為 exe 文件。工具有很多,坑也很多,不建議過多研究,作為學習者直接運行源代碼妥妥的。這里使用 pyinstaller。先安裝打包工具:
pip install pywin32 pip install PyInstaller
在源代碼所在的目錄下執行命令:
pyinstaller -F hack12306.py
等待完成即可在 dist 目錄找到可執行的 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() # 預定車次算法:根據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() # 發送郵件 self.sendmail("搶到票了","請及時付款") print(time.clock() - t) except Exception as e: print(e)
關于Python自動搶火車票的案例就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。