透過程式自動化去刷新並點擊搶票,就有了這個 Python 搶票程式。這個程式是 Python 模擬手動去操作瀏覽器的,所以會因為各種網路或其他因素導致程式終止。本文主要講解增加車次選擇功能和座次選擇功能這兩個最佳化點。
推薦參考學習:《Python教學》
自動搶票流程
1.首先,整理下本次優化後的搶票流程。
2.自動啟動瀏覽器,自動化輸入程式裡設定好的 12306 的登入帳號和密碼。
3.自己手動輸入驗證碼,圖形驗證碼設別功能太複雜,涉及到人工智能的圖像識別,自己做的話成功率不高,所以我在這裡讓大家手動輸入,輸入驗證碼後手動點選“登入”按鈕。
4.登入成功後頁面會自動校驗,確認登入成功後會自動跳到查票頁面。依照自己程式碼裡輸入的出發地和目的地進行查票。
5.根據自己輸入的車次進行查詢右邊「預定」按鈕是否高亮可點,不可點的話會一直點擊「查詢」按鈕不斷的刷新頁面直到出現有票點擊「按鈕」按鈕。
6.提交訂單頁面,選擇乘客,選擇座位類型,如果沒有自己想要的類型,比如,二等座,頁面會重新回到火車票查詢頁面,重新查詢,如此循環。
7.搶到你想要的票後,提交訂單,發送郵件,完成!
登入頁面
這部分我把瀏覽器視窗最大化了,之前沒設定全屏,大家電腦顯示器大小不一樣,可能出現有些元素被遮擋無法點擊。
登入之後可能會出現網路可能出現的問題的提示,估計是伺服器的問題,這時手動點一下左上角的返回,一般就可以恢復正常,如果點一次還是這個提示,那就點兩次吧。
查詢頁面
查詢火車票頁面,這個頁面高峰時間時也會出現逾時的提示,估計是存取的人數過多導致伺服器異常導致的,有時候很快就能查到票,具體什麼時候我也沒找到規律。
這個我們也無法避免,程式會自動的幫我們刷新直到刷新出有票的頁面,刷新頻率:1 秒/次。
車次選擇功能是大家比較關心的功能,之前是order = 0 預設是全部車次,這次大家可以依照車次的位置輸入對應的數字,例如要預定的車在第5 行,你把order = 5 就行,關於這些參數配置,下面會特別列出給大家。
提交訂單頁面
提交訂單頁面程式會做兩件事,第一個是根據你輸入的乘客姓名進行選擇,第二件事是根據是輸入的座次進行判斷,你想要的座次有票的話就會選擇並提交訂單,你想要的座次沒票的話就會返回到上一級頁面,重複查詢車票,檢查座次,如此循環,直到訂到你想要的票。
重要參數修改說明
#重點來了,前面看不懂沒關係,想直接拿原始碼運行的務必仔細看這裡,拿到搶票原始碼後以下事項需要注意並配置。
Python 環境配置
本次程式我用的 Python 環境是 Python 3.6 的版本,其實 3.5 以上的應該都可以。官網上下載Python3 的安裝包,安裝時記得勾選Add Python 3.x to PATH 這個選項,勾選這個選項的好處是安裝完成後它會自動幫你配置環境變量,不用像安裝Python2.x 時需要手動去配置。接下來都是傻瓜式安裝,安裝完成後終端機下輸入 Python 顯示版本的話表示安裝成功。還不會的話建議上網查查,網路教學很多。
pip 工具
pip 是個通用的 Python 函式庫管理工具,使用 pip 很方便的安裝、管理函式庫。第一步完成後這個 pip 工具是自備的,你可以在終端機下輸入 pip list 指令查看你目前安裝的所有 Python 函式庫。
安裝導入對應的函式庫
本程式主要用到的函式庫是 splinter,主要用這個函式庫來驅動瀏覽器進行操作頁面的,用 pip 指令直接安裝。
pip install splinter
Splinter 相關的教學中文文件位址如下,如有興趣的話可以學習一下。
https://splinter-docs-zh-cn.readthedocs.io/zh/latest/tutorial.html
安裝完成後在IDE 中用import 導入這個庫,如果還不能用的話記得在編輯器中安裝引入一下,我用的是Pycharm 編輯器,在設定中引入安裝,見下圖。
Python 傳送郵件需要用到 Python 自帶的兩個模組,smtplib 和 email。直接 import 導入,無需下載。
所以,真正需要安裝的只有 splinter 函式庫,其他直接匯入就可用,在編輯器中匯入。
from splinter.browser import Browser from time import sleep import smtplib from email.mime.text import MIMEText from email.utils import formataddr from email.header import Header
瀏覽器驅動程式下載並指定路徑
這個問題大家也出現比較多,為什麼要下載瀏覽器驅動程式呢?因為 splinter 庫的底層原理是透過 WebDriver 去驅動瀏覽器做相應的操作的,所以使用對應的瀏覽器必須下載對應的瀏覽器驅動程式。我用的是 chrome 瀏覽器,所以我下載的是 chromedriver,這裡還有個坑,chromedriver 和 chrome 瀏覽器有映射關係,你必須下載對應的版本。映射關係如下
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71 ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70 ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69 ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68 ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68 ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67 ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66 ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65 ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64
(Chrome 和ChromeDriver 映射表)
chromedriver 下載解壓縮完成後把他的路徑複製下來,並取代原始碼 33 行中的路徑。
郵件通知功能設定
在上面安裝了對應的庫後,需要填寫的資訊如下:寄件者和收件人信箱、寄件人的授權碼。所以需要修改的位置是 sendMail 函數中的 51 行和 52 行的寄件者信箱帳號和收件者信箱帳號,61 行的寄件者信箱的授權碼。
授權碼取得方法參考文章 30行Python程式碼實作自動收發郵件,我用的發郵件的信箱是我的小號QQ 信箱,收件者信箱是我的大號QQ信箱。我試了下,QQ 信箱裡寄件者和收件者可以是一樣的,也就是可以自己給自己發郵件,大家自行選擇,建議先獨立把發郵件的代碼運行下,查看是否發送成功,一般運作失敗就是因為授權碼不對造成的,重新取得一次授權碼好了。
座次對應的數值
經過偵錯查看,不同的座次對應的 value 值不一樣。
多次偵錯之後,我把不同座次對應的 value 價值整理成了表格。
程式碼修改位置在原始碼112 行和113 兩行,兩行都要改動,改動成你想要的座次對應的value 就行。
12306 使用者名稱和 12306 登入密碼
這兩項在 main 函數中修改成自己的就行,把原始碼 114 和 145 行修改成自己的即可。
車次選擇
車次用了order 欄位來表示,
0 代表所有車次,1 表示第一行的車次,2 表示第二行的車次,以此類推。一般你輸入出發點和目的地後,所有的車次位置是固定的,你輸入你想訂的車次的位置數字即可。原始碼修改位置也是在 main 函數裡,第 146 行。
乘客名格式
乘客名,例如passengers = ['XXX', 'XXX'],支援多選,注意下學生票需註明,註明方式為:passengers = ['XXX(學生)', 'XXX'],不然會報錯,原始碼修改位置也是在main 函數裡,第149 行。
乘車日期格式
乘車日期,格式為:'2019-01-28',原始碼修改位置也是在 main 函數裡,第 151 行。
出發地和目的地cookie 獲取
這個由於時間問題,沒有優化,目前只能手動去查找獲取出發地和目的地,打開自己的12306查詢火車票頁面,輸入出發地和目的地。將頁面的偵錯模式打開,用快捷鍵 F12 或滑鼠右鍵「檢查」開啟偵錯模式,選擇 Network,點選「查詢」按鈕,這樣就能取得對應出發地和目的地的 cookie。原始碼修改位置也是在 main 函數裡,第 153 行和 155 行。
#總結下,以上需要修改的地方,chromedriver 路徑:在初始化函數 init 裡面、郵件通知功能收發郵件信箱帳號和寄件者授權碼在sendMail 函數中修改、修改對應座次value 值在check_ticket 函數中修改、其他資訊包括:12306用戶名、12306密碼、車次選擇、乘客名稱、乘車日期、出發日期、出發地和目的地cookie 值,都在原始碼最下方的main 函數中修改。
重要說明:本程式由於時間有限,配置項目也挺多的,但是為了搶到票,我們只能多嘗試一種方法了,本程式是模擬人工操作瀏覽器,還是會存在很多問題的,比如說由於網絡關係導致頁面長時間停留從而找不到元素而程序停止,其他各種預想不到的問題也會出現,程式停止的話也只能重啟下程式繼續搶,後期大家需要的話我也會慢慢優化。