<font color="red">2024/01/10 正常運行中,注意chromedriver版本 </font> --- ## 需求套件 * selenium 自動化操作 (需配合chromedriver使用) -Select 操作下拉選單 -NoSuchElementException 新增NoSuchElementException錯誤 * requests 爬取需要資料 * ddddocr 驗證碼光學圖形識別 * prettytable 列印好看的表格 * pyinstaller 打包程式使用 * datetime 日期 * pyfiglet 列印好看ASCII Art (非必要) ![](https://hackmd.io/_uploads/BJ5a9Rji3.png) ## 列印高鐵時刻表 ### 讀取從資料平台的站名json檔 打開名為THSR_Station.json的JSON文件,並使用json.load方法將文件中的內容加載下來。 ![](https://hackmd.io/_uploads/HyJBfRoo2.png) 根據使用者輸入的出發站名和抵達站名,尋找相應的站點資訊。 <font color="red">資料平台上站名與高鐵網站上爬蟲的拼音拼法不同(透過統一json檔內的站名解決問題)</font> ![](https://hackmd.io/_uploads/Syt8MRjih.png) 創建一個字典,然後撰寫要向高鐵網站發送POST請求的數據,接著使用requests.post()向指定的URL發送POST請求。 ![](https://hackmd.io/_uploads/rkEYMRjon.png) 從 result 中獲取符合條件的高鐵時刻表資料,並將這些資料以表格的形式輸出。 ![](https://hackmd.io/_uploads/Hkl270is3.png) 獲取高鐵各類型票價資訊並以表格形式輸出(前十筆資料)。 ![](https://hackmd.io/_uploads/r1jDXRoin.png) 結果輸出如下: ![](https://hackmd.io/_uploads/rkMXfJho2.png) --- ## 利用selenium進行自動訂票 從 JSON 檔案中讀取使用者帳戶資訊。 ![](https://hackmd.io/_uploads/BybaNRjjn.png) 順序分別為: 商務/經濟艙、靠窗/靠走道、身分證、電話 ![](https://hackmd.io/_uploads/ryTDRCson.png) 使用selenium時會出現以下,而高鐵是可以偵測出來而拒絕連線的 ![](https://hackmd.io/_uploads/BkLQ1kno2.png) 所以透過chromedriver設定去除自動操作時headline,便可成功連入高鐵官網 ![](https://hackmd.io/_uploads/B1R64Rjoh.png) 先接受網站的 Cookie ,然後找到網頁中各指定 ID 的元素,再將車票種類、身分證字號等訊息填寫進去。 ![](https://hackmd.io/_uploads/SyvRVRjj3.png) 找出驗證碼那格,然後利用 ddddocr 文字識別庫來進行對驗證碼圖片的識別,將識別出的文字填寫進去。 ![](https://hackmd.io/_uploads/SJGJSCojn.png) ddddocr是來自對岸的免費光學圖形識別工具,目前網路上大部分都需要付費的,由於是免費的,所以會有不穩的問題,透過是否獲得下個頁面的elements來確認是否驗證成功,如果失敗是會原頁F5的,透過這個機制來運行迴圈直到成功驗證。 ![](https://hackmd.io/_uploads/Bkw7-13ih.png) 對網頁元素進行提取資料。 ![](https://hackmd.io/_uploads/Hk6ySAsjh.png) 顯示訂票相關資訊,然後將提取內容寫進txt檔內。 ![](https://hackmd.io/_uploads/BkFgHRsi2.png) 結果如下: ![](https://hackmd.io/_uploads/By7Dzy2on.png) 紀錄的txt檔 ![](https://hackmd.io/_uploads/HJDoM12jh.png) --- ## 外觀(非必要) 用pyfiglet產生好看的ASCII文字藝術當開頭 ![](https://hackmd.io/_uploads/HkcxIy2s2.png) ![](https://hackmd.io/_uploads/rkrTrJhin.png) ## 打包程式 最後用pyinstaller打包,這邊不詳述,但有一個重要的地方 <font color="red">部分的套件會有打包的問題,透過以下方式解決</font> 先打包一次,會失敗,並產生程式的SPEC檔 ![](https://hackmd.io/_uploads/B1bPNknsn.png) 透過修過修改這部分,便可正常打包(原本此處是空的) ``` 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'], ``` ![](https://hackmd.io/_uploads/SJvCEk2j3.png) ### 最後結果 ![](https://hackmd.io/_uploads/HJpdSkhon.png) ## 參考內容 > [当我用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/)