基於Python實現火車票搶票軟件
導語
每年的節假日一到,大傢頭疼的總時同一個問題:你買到回傢的票瞭嗎?
尤其是大型的節日:”比如國慶、春節……“
數以億計的人口遷移,讓車票成瞭一年裡最難買到的那張票。
跨站買票、買短途票上車補票、準點撿漏等已是老生常談的技巧。隨著互聯網的發展,搶票軟件成為購票熱門渠道。搶票軟件的到底靠譜嘛?能搶到票嘛?
近日,小編給大傢就正式編寫一款Python實現查票以及自動購票搶票的小程序給大傢,希望大傢如願!
環境準備
1)運行環境:Python 3 、Pycharm、谷歌瀏覽器、谷歌驅動 。
2)模塊準備:
requests —> pip install requests (數據請求模塊)
prettytable —> pip install prettytable (打印好看一些 )
selenium —> pip install selenium==3.141.0 (模擬人的行為去操作瀏覽器)
json —> 內置模塊 不需要安裝
PS小編有話說:(新手看過來)
模塊安裝問題:
如果安裝python第三方模塊:
1. win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車
2. 在pycharm中點擊Terminal(終端) 輸入安裝命令
安裝失敗原因:
失敗一: pip 不是內部命令
解決方法: 設置環境變量
失敗二: 出現大量報紅 (read time out)
解決方法: 因為是網絡鏈接超時, 需要切換鏡像源
- 清華:https://pypi.tuna.tsinghua.edu.cn/simple
- 阿裡雲:https://mirrors.aliyun.com/pypi/simple/
- 中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/
- 華中理工大學:https://pypi.hustunique.com/
- 山東理工大學:https://pypi.sdutlinux.org/
- 豆瓣:https://pypi.douban.com/simple/
例如:pip3 install -i https://pypi.doubanio.com/simple/ 模塊名
失敗三: cmd裡面顯示已經安裝過瞭, 或者安裝成功瞭, 但是在pycharm裡面還是無法導入
解決方法: 可能安裝瞭多個python版本 (anaconda 或者 python 安裝一個即可) 卸載一個就好
或者你pycharm裡面python解釋器沒有設置好。
如何配置pycharm裡面的python解釋器?
1. 選擇file(文件) >>> setting(設置) >>> Project(項目) >>> python interpreter(python解釋器)
2. 點擊齒輪, 選擇add
3. 添加python安裝路徑
pycharm如何安裝插件?
1. 選擇file(文件) >>> setting(設置) >>> Plugins(插件)
2. 點擊 Marketplace 輸入想要安裝的插件名字 比如:翻譯插件 輸入 translation / 漢化插件 輸入 Chinese
3. 選擇相應的插件點擊 install(安裝) 即可
4. 安裝成功之後 是會彈出 重啟pycharm的選項 點擊確定, 重啟即可生效
項目思路
12306 每天隻能退票三次
查票
購票
建議谷歌或者火狐….
爬蟲采集數據思路:
一. 分析數據來源
車票信息, 來源那個數據包 <車票信息請求那個網站url地址可以得到>
開發者工具 1 2
二. 代碼實現步驟:
1. 發送請求, 對於剛剛分析得到url地址發送請求
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-07-02&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=SHH&purpose_codes=ADULT
2. 獲取數據, 獲取服務器返回響應數據, response
3. 解析數據, 提取我們想要車次信息
代碼展示
import requests # 導入漂亮的表格輸出模塊 ---> 第三方模塊 需要 在cmd裡面進行 pip install prettytable import prettytable as pt # 導入json import json # 導入selenium模塊 ---> 第三方模塊 需要 在cmd裡面進行 pip install selenium==3.141.0 from selenium import webdriver # 導入賬號密碼 from password import account, Password # 導入selenium控制鍵盤 from selenium.webdriver.common.keys import Keys # 創建瀏覽器 <打開瀏覽器> 瀏覽器驅動放在python安裝目錄裡面就不需要添加路徑 def get_ticket(num, from_station, to_station, date_key): driver = webdriver.Chrome() # 輸入網址 driver.get('https://kyfw.12306.cn/otn/resources/login.html') # 通過元素定位, 找到賬號輸入框 輸入賬號 send_keys() 發送或者輸入內容 driver.find_element_by_css_selector('#J-userName').send_keys(account) # 通過 css 選擇器查找元素 # 通過元素定位, 找到密碼輸入框 輸入密碼 send_keys() 發送或者輸入內容 driver.find_element_by_css_selector('#J-password').send_keys(Password) # 通過 css 選擇器查找元素 # 通過元素定位, 找到登陸按鈕, 點擊登陸 driver.find_element_by_css_selector('#J-login').click() # 隱式等待 driver.implicitly_wait(10) # 通過元素定位, 點擊彈窗確定按鈕 .表示class # 表示ID driver.find_element_by_css_selector('.modal-ft .btn').click() # 通過元素定位, 點擊車票預定 driver.find_element_by_css_selector('#link_for_ticket').click() # 通過元素定位, 點擊鍵盤回車 driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER) # 通過元素定位, 清空輸入框內容 driver.find_element_by_css_selector('#fromStationText').clear() # 通過元素定位, 點擊一下輸入框 driver.find_element_by_css_selector('#fromStationText').click() # 通過元素定位, 輸入出發城市 driver.find_element_by_css_selector('#fromStationText').send_keys(from_station) # 通過元素定位, 點擊鍵盤回車 driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER) driver.find_element_by_css_selector('#toStationText').clear() driver.find_element_by_css_selector('#toStationText').click() driver.find_element_by_css_selector('#toStationText').send_keys(to_station) driver.find_element_by_css_selector('#toStationText').send_keys(Keys.ENTER) date = driver.find_element_by_css_selector('.inp-w #train_date') date.clear() date.send_keys(date_key) # 通過元素定位, 點擊查詢按鈕 driver.find_element_by_css_selector('#query_ticket').click() if num == 1: driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({num}) a.btn72').click() elif num != 1: driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({num + 1}) a.btn72').click() # #normalPassenger_0 driver.find_element_by_css_selector('#normalPassenger_1').click() driver.find_element_by_css_selector('#submitOrder_id').click() driver.find_element_by_css_selector('#qr_submit_id').click() driver.find_element_by_css_selector('#qr_submit_id').click() f = open('city.json', encoding='utf-8') text = f.read() # 讀取文件 json_data = json.loads(text) from_city = input('請輸入你要出發城市: ') to_city = input('請輸入你要到達城市: ') date = input('請輸入你要出發的時間: ') from_station = json_data[from_city] to_station = json_data[to_city] """ 發送請求, 模擬瀏覽器對於url地址發送請求 快捷批量替換方法: 選中內容, ctrl + R 輸入正則表達式命令點擊全部替換即可 (.*?): (.*) '$1': '$2', """ # 確定請求網址 ---> 如果對於長鏈接, 我們是可以分段寫 ? 後面都是屬於請求參數 url = 'https://kyfw.12306.cn/otn/leftTicket/query' # 請求參數 ---> 字典數據類型, 構建成完整鍵值對, 鍵值對與鍵值對之間要用逗號隔開 data = { 'leftTicketDTO.train_date': date, 'leftTicketDTO.from_station': from_station, 'leftTicketDTO.to_station': to_station, 'purpose_codes': 'ADULT', } # 請求頭 ---> 偽裝模擬瀏覽器的, 把python代碼偽裝成瀏覽器發送請求 headers = { # User-Agent: 用戶代理, 表示瀏覽器基本身份標識 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36', } # 發送請求 ---> 返回數據 <Response [200]> 響應對象 200狀態碼表示請求成功 response = requests.get(url=url, params=data, headers=headers) # 獲取數據 response.json() 獲取響應對象json字典數據 # 解析數據 ---> 根據數據類型以及你想要獲取數據內容, 選擇最合適提取方式 根據冒號左邊的內容, 提取冒號右邊內容 result = response.json()['data']['result'] # 實例化對象 tb = pt.PrettyTable() tb.field_names = [ '序號', '車次', '出發時間', '到達時間', '耗時', '特等座', '一等', '二等', '軟臥', '硬臥', '硬座', '無座', ] page = 0 lis = [] # for循環 就把列表裡面元素一個一個提取出來 for index in result: # split() 字符串分割方法 --> 返回是列表 content_list = index.split('|') # 根據列表索引位置提取內容 num = content_list[3] # 車次 start_time = content_list[8] # 出發時間 end_time = content_list[9] # 到達時間 use_time = content_list[10] # 耗時 topGrade = content_list[25] # 特等座 if topGrade: pass else: topGrade = content_list[32] first_class = content_list[31] # 一等 second_class = content_list[30] # 二等 hard_sleeper = content_list[28] # 硬臥 hard_seat = content_list[29] # 硬座 no_seat = content_list[26] # 無座 soft_sleeper = content_list[23] # 軟臥 dit = { '車次': num, '出發時間': start_time, '到達時間': end_time, '耗時': use_time, '特等座': topGrade, '一等': first_class, '二等': second_class, '軟臥': soft_sleeper, '硬臥': hard_sleeper, '硬座': hard_seat, '無座': no_seat, } lis.append(dit) tb.add_row([ page, num, start_time, end_time, use_time, topGrade, first_class, second_class, soft_sleeper, hard_sleeper, hard_seat, no_seat, ]) page += 1 # 更加方便直觀查看 索引位置 ---> 列表可以通過索引位置取值 # num = 0 # for i in content_list: # # i 列表裡面元素, num 對應列表索引位置 # print(i, num) # num += 1 # break print(tb) num = input('請輸入你想要購買車票序號: ') get_ticket(num=int(num), from_station=from_city, to_station=to_city, date_key=date)
到此這篇關於基於Python實現火車票搶票軟件的文章就介紹到這瞭,更多相關Python火車票搶票內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 手把手教你搭建python+selenium自動化環境(圖文)
- Python構建自動在線刷視頻的實現
- python爬蟲實現最新12306搶票
- 詳解Python 使用 selenium 進行自動化測試或者協助日常工作
- 基於python+selenium自動健康打卡的實現代碼