過年車票很難買?資深Python程式猿表示不服!
2018年即將接近尾聲,2019年即將向我們大步走來,不知道大家過年的票有沒有買好呢?作為一個程式設計師,這搶回家過年的票還是要露一手的,嘿嘿嘿。程式碼肯定是用 Python+Splinter開發,Python就不用多介紹了,Splinter是一個使用Python開發的開源Web應用測試工具,它可以幫你實現自動瀏覽站點和與其進行互動。首先安裝好Python 3(Python 2也可以),然後安裝Splinter `pip install Splinter`;或許有的人對Splinter或許不熟悉,因此 對於Splinter.broser部分方法進行介紹:
1. findbyid("控制元件id").first:根據id找到元件
2. visis(url):訪問指定網址
3. fill("填充的內容"):用指定內容填充元件
4. click():點選事件
5. reload():重新載入當前文件
一、 接下來進行主要思路的介紹:
1. 自動填充使用者名稱,密碼,點選圖片驗證碼(手動),自動點選購票查詢,預訂,自動選擇指定乘客進入提交訂單頁面
2. 除登入時的圖片驗證碼,全程自動
二.、error(下面是我已經嘗試成功的):
1. OSError: [WinError 193] %1 不是有效的 Win32 應用程式。
2. 解決方案:chromedriver版本和電腦瀏覽器版本對映沒對應
3. ImportError: cannot import name 'Browser'。
4. 解決方案:是否安裝了Splinter `pip install Splinter`,將程式碼檔案和chromedriver放到一個新資料夾下,防止其他檔案的影響
5. 請在執行檔案前,將程式碼內的乘客,使用者名稱,密碼正確填寫好,檢查cookies是否正確
三. cookies 檢視
1. 進入瀏覽器,按F12,選中NetWork選項,如下圖
2. 起始地址:`_jc_save_fromStation` 購票時間:`_jc_save_fromDate` 目的地:`_jc_save_toStation`
四. 執行方法
1. python trainticket.py 天津 南昌 2018-02-10
2. OK
五、原始碼
# -*- coding:utf-8 -*- """ @author Jianxiong Rao """ from splinter.browser import Browser from time import sleep import traceback import time,sys import os class HuoChe(object): """docstring for Train""" driver_name='' executable_path='' #使用者名稱 密碼 username = u"12306帳戶名" passwd = u"12306密碼" #cookies值自己找 # 天津%u5929%u6D25%2CTJP 南昌%u5357%u660C%2CNCG 桂 林%u6842%u6797%2CGLZ starts = u"%u5929%u6D25%2CTJP" ends = u"%u5357%u660C%2CNCG" #時間格式2018-02-05 dtime = u"2018-02-05" #車次,選擇第幾趟,0則從上之下依次點選 order = 0 ###乘客姓名 users=[u'乘客名'] ##席位 xb=u"二等座" pz=u"成人票" """網址""" #12306查詢URL ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init" #12306登入URL login_url = "https://kyfw.12306.cn/otn/login/init" #我的12306URL initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306" #購票URL buy="https://kyfw.12306.cn/otn/confirmPassenger/initDc" login_url='https://kyfw.12306.cn/otn/login/init' def __init__(self): self.driver_name = 'chrome' self.executable_path = os.getcwd()+'/chromedriver' print("Welcome To Use The Tool") def login(self): self.driver.visit(self.login_url) #填充密碼 self.driver.fill("loginUserDTO.user_name",self.username) #sleep(1) self.driver.fill("userDTO.password",self.passwd) print("等待驗證碼,自行輸入....") while True: if self.driver.url != self.initmy_url: sleep(1) else : break def start(self): self.driver = Browser(driver_name=self.driver_name,executable_path = self.executable_path) self.driver.driver.set_window_size(1400,1000) self.login() #sleep(1) self.driver.visit(self.ticket_url) try: print("購票頁面開始....") #sleep(1) #載入查詢資訊 self.driver.cookies.add({"_jc_save_fromStation":self.starts}) self.driver.cookies.add({"_jc_save_toStation":self.ends}) self.driver.cookies.add({"_jc_save_fromDate":self.dtime}) self.driver.reload() count = 0 if self.order != 0: while self.driver.url == self.ticket_url: self.driver.find_bytext(u"查詢").click() count += 1 print("迴圈點選查詢.... 第 %s 次"%count) #sleep(1) try: self.driver.find_by_text(u'預訂')[self.order - 1].click() except Exception as e: print(e) print("還沒開始預訂") continue else : while self.driver.url == self.ticket_url: self.driver.find_by_text(u"查詢").click() count += 1 print("迴圈點選查詢.... 第 %s 次"%count) #sleep(0.8) try: for i in self.driver.find_by_text(u"預訂"): i.click() sleep(1) except Exception as e: print(e) print("還沒開始預訂 %s "%count) continue print("開始預訂....") #sleep(1) #self.driver.reload() sleep(1) print("開始選擇使用者....") for user in self.users: self.driver.find_by_text(user).last.click() print("提交訂單....") sleep(1) # self.driver.find_by_text(self.pz).click() # self.driver.find_by_id('').select(self.pz) # sleep(1) # self.driver.find_by_text(self.xb).click() # sleep(1) self.driver.find_by_id('submitOrder_id').click() print("開始選座...") # self.driver.find_by_id('1D').last.click() # self.driver.find_by_id('1F').last.click() sleep(1.5) print("確認選座....") self.driver.find_by_text('qr_submit_id').click() except Exception as e: print(e) cities={ '天津':'%u5929%u6D25%2CTJP', '南昌':'%u5357%u660C%2CNCG', '桂林':'%u6842%u6797%2CGLZ' } if __name__=="__main__": train = HuoChe() train.starts = cities[sys.argv[1]] train.ends = cities[sys.argv[2]] train.dtime = sys.argv[3] train.start()
以上就是本文全部內容,喜歡本文的小夥伴或者覺得本文對你有幫助可以點播關注或轉發。
小編精心推薦一個學習Python的好去處,如有想來的小夥伴可以私信小編PT。這裡有免費的學習資料可以領取喔!由於原始碼在頭條上排版出來不好看,想要本文原始碼txt檔案的也可以私信小編!