<font color="red">2024/01/10 正常運行中,注意chromedriver版本 </font> --- ## 需求套件 * selenium 自動化操作 (需配合chromedriver使用) -Select 操作下拉選單 -NoSuchElementException 新增NoSuchElementException錯誤 * requests 爬取需要資料 * ddddocr 驗證碼光學圖形識別 * prettytable 列印好看的表格 * pyinstaller 打包程式使用 * datetime 日期 * pyfiglet 列印好看ASCII Art (非必要)  ## 列印高鐵時刻表 ### 讀取從資料平台的站名json檔 打開名為THSR_Station.json的JSON文件,並使用json.load方法將文件中的內容加載下來。  根據使用者輸入的出發站名和抵達站名,尋找相應的站點資訊。 <font color="red">資料平台上站名與高鐵網站上爬蟲的拼音拼法不同(透過統一json檔內的站名解決問題)</font>  創建一個字典,然後撰寫要向高鐵網站發送POST請求的數據,接著使用requests.post()向指定的URL發送POST請求。  從 result 中獲取符合條件的高鐵時刻表資料,並將這些資料以表格的形式輸出。  獲取高鐵各類型票價資訊並以表格形式輸出(前十筆資料)。  結果輸出如下:  --- ## 利用selenium進行自動訂票 從 JSON 檔案中讀取使用者帳戶資訊。  順序分別為: 商務/經濟艙、靠窗/靠走道、身分證、電話  使用selenium時會出現以下,而高鐵是可以偵測出來而拒絕連線的  所以透過chromedriver設定去除自動操作時headline,便可成功連入高鐵官網  先接受網站的 Cookie ,然後找到網頁中各指定 ID 的元素,再將車票種類、身分證字號等訊息填寫進去。  找出驗證碼那格,然後利用 ddddocr 文字識別庫來進行對驗證碼圖片的識別,將識別出的文字填寫進去。  ddddocr是來自對岸的免費光學圖形識別工具,目前網路上大部分都需要付費的,由於是免費的,所以會有不穩的問題,透過是否獲得下個頁面的elements來確認是否驗證成功,如果失敗是會原頁F5的,透過這個機制來運行迴圈直到成功驗證。  對網頁元素進行提取資料。  顯示訂票相關資訊,然後將提取內容寫進txt檔內。  結果如下:  紀錄的txt檔  --- ## 外觀(非必要) 用pyfiglet產生好看的ASCII文字藝術當開頭   ## 打包程式 最後用pyinstaller打包,這邊不詳述,但有一個重要的地方 <font color="red">部分的套件會有打包的問題,透過以下方式解決</font> 先打包一次,會失敗,並產生程式的SPEC檔  透過修過修改這部分,便可正常打包(原本此處是空的) ``` datas=[('C:/Users/asus/AppData/Local/Programs/Python/Python310/Lib/site-packages/onnxruntime/capi/onnxruntime_providers_shared.dll','onnxruntime\\capi'),('C:/Users/asus/AppData/Local/Programs/Python/Python310/Lib/site-packages/ddddocr/common.onnx','ddddocr'),('C:/Users/asus/AppData/Local/Programs/Python/Python310/Lib/site-packages/pyfiglet/fonts/standard.flf','pyfiglet/fonts')], hiddenimports=['pyfiglet.fonts'], ```  ### 最後結果  ## 參考內容 > [当我用Python实现了12306火车票自动抢票之后,全班的抢票任务都交给了我!](https://www.youtube.com/watch?v=IDG6rG6jyOw&t=3s&ab_channel=%E8%BD%BB%E6%9D%BE%E5%AD%A6python) > [台灣高鐵](https://www.thsrc.com.tw/)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up