python判断火车票座位_Python抢票程序优化,可以选择车次和座次
Python搶票程序優(yōu)化,可以選擇車次和座次
閱讀文本大概需要 5 分鐘。
pk 哥在元旦前寫了一篇關(guān)于自動(dòng)化搶票的程序
用Python搶火車票加郵件通知,同時(shí)建了一個(gè)火車票助力群,本來只是寫著玩玩,增加搶票的另一種途徑而已。沒想到短短幾天,群里加了將近 150 名小伙伴,這也預(yù)示春節(jié)的火車票真是一票難求啊。
Python搶票程序優(yōu)化,可以選擇車次和座次
pk 哥寫這個(gè)程序的初衷是因?yàn)槿ツ晡业姆党唐笔峭ㄟ^手動(dòng)不停的刷新點(diǎn)擊搶到的,我想著能不能通過程序自動(dòng)化去刷新并點(diǎn)擊搶票,所以就有了這個(gè) Python 搶票程序。
畢竟這個(gè)程序是 Python 模擬手工去操作瀏覽器的,所以會(huì)因?yàn)楦鞣N網(wǎng)絡(luò)或者其他因素導(dǎo)致程序終止,群里反饋?zhàn)疃嗟木褪窃黾榆嚧芜x擇功能和座次選擇功能。本文主要講解這兩個(gè)優(yōu)化點(diǎn),群里也有很多小白也在用這個(gè)程序,所以本文會(huì)對(duì)一些詳細(xì)的參數(shù)配置進(jìn)行說明。
自動(dòng)搶票流程
首先,梳理下本次優(yōu)化后的搶票流程。
自動(dòng)啟動(dòng)瀏覽器,自動(dòng)化輸入程序里設(shè)置好的 12306 的登錄賬號(hào)和密碼。
自己手動(dòng)輸入驗(yàn)證碼,圖形驗(yàn)證碼設(shè)別功能太復(fù)雜,涉及到人工智能的圖像識(shí)別,自己做的話成功率不高,所以我這里讓大家手動(dòng)輸入,輸入驗(yàn)證碼后手動(dòng)點(diǎn)擊「登錄」按鈕。
登錄成功后頁面會(huì)自動(dòng)校驗(yàn),確認(rèn)登錄成功后會(huì)自動(dòng)跳轉(zhuǎn)到查票頁面。根據(jù)自己程序代碼里輸入的出發(fā)地和目的地進(jìn)行查票。
根據(jù)自己輸入的車次進(jìn)行查詢右邊「預(yù)定」按鈕是否高亮可點(diǎn),不可點(diǎn)的話會(huì)一直點(diǎn)擊「查詢」按鈕不斷的刷新頁面直到出現(xiàn)有票點(diǎn)擊「按鈕」按鈕。
提交訂單頁面,選擇乘客,選擇座位類型,如果沒有自己想要的類型,比如,二等座,頁面會(huì)重新回到火車票查詢頁面,重新查詢,如此循環(huán)。
搶到你想要的票后,提交訂單,發(fā)送郵件,完成!
登錄頁面
這部分我把瀏覽器窗口最大化了,之前沒設(shè)置全屏,大家電腦顯示屏大小不一樣,可能出現(xiàn)有些元素被遮擋無法點(diǎn)擊。
登錄之后可能會(huì)出現(xiàn)網(wǎng)絡(luò)可能出現(xiàn)的問題的提示,估計(jì)是服務(wù)器的問題,這時(shí)手動(dòng)點(diǎn)一下左上角的返回,一般就可以恢復(fù)正常,如果點(diǎn)一次還是這個(gè)提示,那就點(diǎn)兩次吧。
Python搶票程序優(yōu)化,可以選擇車次和座次
查詢頁面
查詢火車票頁面,這個(gè)頁面峰值時(shí)間時(shí)也會(huì)出現(xiàn)超時(shí)的提示,估計(jì)是訪問的人數(shù)過多導(dǎo)致服務(wù)器異常導(dǎo)致的,有時(shí)候很快就能查到票,具體什么時(shí)候我也沒找到規(guī)律。
Python搶票程序優(yōu)化,可以選擇車次和座次
這個(gè)我們也無法避免,程序會(huì)自動(dòng)的幫我們刷新直到刷新出有票的頁面,刷新頻率:1 秒/次。
車次選擇功能是大家比較關(guān)心的功能,之前是 order = 0 默認(rèn)是全部車次,這次大家可以根據(jù)車次的位置輸入相應(yīng)的數(shù)字,比如要預(yù)定的車在第 5 行,你把 order = 5 就行,關(guān)于這些參數(shù)配置,下面會(huì)專門給大家列出來。
提交訂單頁面
提交訂單頁面程序會(huì)做兩件事,第一個(gè)是根據(jù)你輸入的乘客姓名進(jìn)行選擇,第二件事是根據(jù)是輸入的座次進(jìn)行判斷,你想要的座次有票的話就會(huì)選擇并提交訂單,你想要的座次沒票的話就會(huì)返回到上一級(jí)頁面,重復(fù)查詢車票,檢查座次,如此循環(huán),直到訂到你想要的票。
Python搶票程序優(yōu)化,可以選擇車次和座次
郵件通知
郵件通知功能之前單獨(dú)有寫過一篇文章,大家如果不確定郵件通知功能是否有效的話可以單獨(dú)把這部分源碼拿出來,運(yùn)行看看是否能發(fā)送成功,源碼在公眾號(hào)回復(fù)「郵件」獲取,關(guān)于郵件通知的文章戳這里查看
Python搶票程序優(yōu)化,可以選擇車次和座次
30行Python代碼實(shí)現(xiàn)自動(dòng)收發(fā)郵件。
重要參數(shù)修改說明
重點(diǎn)來了,前面看不懂沒關(guān)系,想直接拿源碼運(yùn)行的務(wù)必仔細(xì)看這里,拿到搶票源碼后以下事項(xiàng)需要注意并配置。
Python 環(huán)境配置
本次程序我用的 Python 環(huán)境是 Python 3.6 的版本,其實(shí) 3.5 以上的應(yīng)該都可以。官網(wǎng)上下載 Python3 的安裝包,安裝時(shí)記得勾選 Add Python 3.x to PATH 這個(gè)選項(xiàng),勾選這個(gè)選項(xiàng)的好處是安裝完成后它會(huì)自動(dòng)幫你配置環(huán)境變量,不用像安裝 Python2.x 時(shí)需要手動(dòng)去配置。接下來都是傻瓜式安裝,安裝完成后終端下輸入 Python 顯示版本的話表示安裝成功。還不會(huì)的話建議上網(wǎng)查查,網(wǎng)上教程很多。
Python搶票程序優(yōu)化,可以選擇車次和座次
pip 工具
pip 是通用的 Python 庫管理工具,使用 pip 很方便的安裝、管理庫。第一步完成后這個(gè) pip 工具是自帶的,你可以在終端下輸入 pip list 命令查看你當(dāng)前安裝的所有 Python 庫。
Python搶票程序優(yōu)化,可以選擇車次和座次
安裝導(dǎo)入相應(yīng)的庫
本程序主要用到的庫是 splinter,主要用這個(gè)庫來驅(qū)動(dòng)瀏覽器進(jìn)行操作頁面的,用 pip 命令直接安裝。
pip install splinterSplinter 相關(guān)的教程中文文檔地址如下,如有興趣的話可以學(xué)習(xí)一下。
https://splinter-docs-zh-cn.readthedocs.io/zh/latest/tutorial.html安裝完成后在 IDE 中用 import 導(dǎo)入這個(gè)庫,如果還不能用的話記得在編輯器中安裝引入一下,我用的是 Pycharm 編輯器,在設(shè)置中引入安裝,見下圖。
Python搶票程序優(yōu)化,可以選擇車次和座次
Python 發(fā)送郵件需要用到 Python 自帶的兩個(gè)模塊,smtplib 和 email。直接 import 導(dǎo)入,無需下載。
所以,真正需要安裝的只有 splinter 庫,其他直接導(dǎo)入就可用,在編輯器中導(dǎo)入。
from splinter.browser import Browserfrom time import sleep
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.header import Header
瀏覽器驅(qū)動(dòng)下載并指定路徑
這個(gè)問題大家也出現(xiàn)比較多,為什么要下載瀏覽器驅(qū)動(dòng)呢?因?yàn)?splinter 庫的底層原理是通過 WebDriver 去驅(qū)動(dòng)瀏覽器做相應(yīng)的操作的,所以使用對(duì)應(yīng)的瀏覽器必須要下載對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)。我用的是 chrome 瀏覽器,所以我下載的是 chromedriver,這里還有個(gè)坑,chromedriver 和 chrome 瀏覽器有映射關(guān)系,你必須下載對(duì)應(yīng)的版本。映射關(guān)系如下,大家先查看你的 chrome 瀏覽器版本,再下載對(duì)應(yīng)的 chromedriver,chromedriver 下載地址點(diǎn)擊「閱讀原文」可查看。(左右滑動(dòng)查看全部)
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71ChromeDriver 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 下載解壓完成后把他的路徑復(fù)制下來,替換源碼 33 行中的路徑。
Python搶票程序優(yōu)化,可以選擇車次和座次
郵件通知功能設(shè)置
上面安裝了對(duì)應(yīng)的庫后,需要填寫的信息如下:發(fā)件人和收件人郵箱、發(fā)件人的授權(quán)碼。所以需要修改的位置是 sendMail 函數(shù)中的 51 行和 52 行的發(fā)件人郵箱賬號(hào)和收件人郵箱賬號(hào),61 行的發(fā)件人郵箱的授權(quán)碼。
Python搶票程序優(yōu)化,可以選擇車次和座次
授權(quán)碼獲取方法參考文章
Python搶票程序優(yōu)化,可以選擇車次和座次
30行Python代碼實(shí)現(xiàn)自動(dòng)收發(fā)郵件,我用的發(fā)郵件的郵箱是我的小號(hào) QQ 郵箱,收件人郵箱是我的大號(hào) QQ郵箱。我試了下,QQ 郵箱里發(fā)件人和收件人可以是一樣的,也就是可以自己給自己發(fā)郵件,大家自行選擇,建議先獨(dú)立把發(fā)郵件的代碼運(yùn)行下,查看是否發(fā)送成功,一般運(yùn)行失敗就是因?yàn)槭跈?quán)碼不對(duì)造成的,重新獲取一次授權(quán)碼好了。公眾號(hào)回復(fù)「郵件」獲取發(fā)郵件功能的源碼。
座次對(duì)應(yīng)的數(shù)值
經(jīng)過調(diào)試查看,不同的座次對(duì)應(yīng)的 value 值不一樣。
Python搶票程序優(yōu)化,可以選擇車次和座次
多次調(diào)試之后,我把不同座次對(duì)應(yīng)的 value 值整理成了表格。
Python搶票程序優(yōu)化,可以選擇車次和座次
代碼修改位置在源碼 112 行和 113 兩行,兩行都要改動(dòng),改動(dòng)成你想要的座次對(duì)應(yīng)的 value 就行。
12306 用戶名和 12306 登錄密碼
這兩項(xiàng)在 main 函數(shù)中修改成自己的就行,把源碼 114 和 145 行修改成自己的即可。
車次選擇
車次用了 order 字段來表示,
0 代表所有車次,1 表示第一行的車次,2 表示第二行的車次,以此類推。一般你輸入出發(fā)點(diǎn)和目的地后,所有的車次位置是固定的,你輸入你想訂的車次的位置數(shù)字即可。源碼修改位置也是在 main 函數(shù)里,第 146 行。
乘客名格式
乘客名,比如 passengers = ['XXX', 'XXX'],支持多選,注意下學(xué)生票需注明,注明方式為:passengers = ['XXX(學(xué)生)', 'XXX'],不然會(huì)報(bào)錯(cuò),源碼修改位置也是在 main 函數(shù)里,第 149 行。
乘車日期格式
乘車日期,格式為:'2019-01-28',源碼修改位置也是在 main 函數(shù)里,第 151 行。
出發(fā)地和目的地 cookie 獲取
這個(gè)由于時(shí)間問題,沒有優(yōu)化,目前只能手動(dòng)去查找獲取出發(fā)地和目的地,打開自己的 12306 查詢火車票頁面,輸入出發(fā)地和目的地。將頁面的調(diào)試模式打開,用快捷鍵 F12 或者鼠標(biāo)右鍵「檢查」打開調(diào)試模式,選擇 Network,點(diǎn)擊「查詢」按鈕,這樣就能獲取對(duì)應(yīng)出發(fā)地和目的地的 cookie。源碼修改位置也是在 main 函數(shù)里,第 153 行和 155 行。
Python搶票程序優(yōu)化,可以選擇車次和座次
總結(jié)下,以上需要修改的地方,chromedriver 路徑:在初始化函數(shù) init 里面、郵件通知功能收發(fā)郵箱賬號(hào)和發(fā)件人授權(quán)碼在 sendMail 函數(shù)中修改、修改對(duì)應(yīng)座次 value 值在 check_ticket 函數(shù)中修改、其他信息包括:12306用戶名、12306密碼、車次選擇、乘客名、乘車日期、出發(fā)日期、出發(fā)地和目的地 cookie 值,都在源碼最下方的 main 函數(shù)中修改。
Python搶票程序優(yōu)化,可以選擇車次和座次
重要說明:本程序由于時(shí)間有限,配置項(xiàng)也挺多的,但是為了搶到票,我們只能多嘗試一種方法了,本程序是模擬人工操作瀏覽器,還是會(huì)存在很多問題的,比如說由于網(wǎng)絡(luò)關(guān)系導(dǎo)致頁面長時(shí)間停留從而找不到元素而程序停止,其他各種預(yù)想不到的問題也會(huì)出現(xiàn),程序停止的話也只能重啟下程序繼續(xù)搶,后期大家需要的話我也會(huì)慢慢優(yōu)化。歡迎大家在搶票群里一起優(yōu)化討論,畢竟我也要工作,個(gè)人時(shí)間有限。大家也不要把它當(dāng)做唯一的搶票工具,我們還是要把其他的搶票工具一起用起來,所以我建火車票助理群的目的也是為了讓大家有更多的途徑搶到票,回家過年,大家相互點(diǎn)點(diǎn)助力,這樣搶到額概率更大一下。
總結(jié)
以上是生活随笔為你收集整理的python判断火车票座位_Python抢票程序优化,可以选择车次和座次的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac mysql 的lb_四层LB和七
- 下一篇: python大列表分割成小列表_Pyth