一百多行python代碼實(shí)現(xiàn)搶票助手
一. 代碼使用Python+Splinter開(kāi)發(fā),Splinter是一個(gè)使用Python開(kāi)發(fā)的開(kāi)源Web應(yīng)用測(cè)試工具,它可以幫你實(shí)現(xiàn)自動(dòng)瀏覽站點(diǎn)和與其進(jìn)行交互。
二. 安裝好Python 3或2都可以,然后安裝Splinter `pip install Splinter
三. Splinter注意事項(xiàng)
1. Splinter的Browser類(lèi)默認(rèn)優(yōu)先使用firefox,所以用chrome的話,需要指定driver_name="chrome",只要養(yǎng)成一個(gè)習(xí)慣,不管用什么瀏覽器都指定,問(wèn)題會(huì)出得少
2. 當(dāng)然,選擇chrome的話,需要查看自己瀏覽器的版本,需要和chromedriver版本對(duì)應(yīng)(不是版本號(hào)一致),參考和下載地址
四. Splinter.broser部分方法介紹
1. findbyid("控件id").first:根據(jù)id找到組件
2. visis(url):訪問(wèn)指定網(wǎng)址
3. fill("填充的內(nèi)容"):用指定內(nèi)容填充組件
4. click():點(diǎn)擊事件
5. reload():重新加載當(dāng)前文檔
五. 主要思路:
1. 自動(dòng)填充用戶(hù)名,密碼,點(diǎn)擊圖片驗(yàn)證碼(手動(dòng)),自動(dòng)點(diǎn)擊購(gòu)票查詢(xún),預(yù)訂,自動(dòng)選擇指定乘客進(jìn)入提交訂單頁(yè)面
2. 除登錄時(shí)的圖片驗(yàn)證碼,全程自動(dòng)
六. error(下面是我已經(jīng)嘗試成功的):
1. OSError: [WinError 193] %1 不是有效的 Win32 應(yīng)用程序。
2. 解決方案:chromedriver版本和電腦瀏覽器版本映射沒(méi)對(duì)應(yīng)
3. ImportError: cannot import name 'Browser'。
4. 解決方案:是否安裝了Splinter `pip install Splinter`,將代碼文件和chromedriver放到一個(gè)新文件夾下,防止其他文件的影響
5. 請(qǐng)?jiān)谶\(yùn)行文件前,將代碼內(nèi)的乘客,用戶(hù)名,密碼正確填寫(xiě)好,檢查cookies是否正確
七. cookies 查看
1. 進(jìn)入chrome瀏覽器,按F12,選中NetWork選項(xiàng),如下圖
2. 起始地址:`_jc_save_fromStation` 購(gòu)票時(shí)間:`_jc_save_fromDate` 目的地:`_jc_save_toStation`
八. 運(yùn)行方法
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='' #用戶(hù)名 密碼 username = u"12306帳戶(hù)名" passwd = u"12306密碼" #cookies值自己找 # 天津%u5929%u6D25%2CTJP 南昌%u5357%u660C%2CNCG 桂林%u6842%u6797%2CGLZ starts = u"%u5929%u6D25%2CTJP" ends = u"%u5357%u660C%2CNCG" #時(shí)間格式2018-02-05 dtime = u"2018-02-05" #車(chē)次,選擇第幾趟,0則從上之下依次點(diǎn)擊 order = 0 ###乘客姓名 users=[u'乘客名'] ##席位 xb=u"二等座" pz=u"成人票" """網(wǎng)址""" #12306查詢(xún)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" #購(gòu)票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("等待驗(yàn)證碼,自行輸入....") 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("購(gòu)票頁(yè)面開(kāi)始....") #sleep(1) #加載查詢(xún)信息 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"查詢(xún)").click() count += 1 print("循環(huán)點(diǎn)擊查詢(xún).... 第 %s 次"%count) #sleep(1) try: self.driver.find_by_text(u'預(yù)訂')[self.order - 1].click() except Exception as e: print(e) print("還沒(méi)開(kāi)始預(yù)訂") continue else : while self.driver.url == self.ticket_url: self.driver.find_by_text(u"查詢(xún)").click() count += 1 print("循環(huán)點(diǎn)擊查詢(xún).... 第 %s 次"%count) #sleep(0.8) try: for i in self.driver.find_by_text(u"預(yù)訂"): i.click() sleep(1) except Exception as e: print(e) print("還沒(méi)開(kāi)始預(yù)訂 %s "%count) continue print("開(kāi)始預(yù)訂....") #sleep(1) #self.driver.reload() sleep(1) print("開(kāi)始選擇用戶(hù)....") 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("開(kāi)始選座...") # self.driver.find_by_id('1D').last.click() # self.driver.find_by_id('1F').last.click() sleep(1.5) print("確認(rèn)選座....") 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()
十. 源碼地址
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 教你用Python來(lái)制作一個(gè)自動(dòng)搶票的腳本小程序
- 基于Python實(shí)現(xiàn)火車(chē)票搶票軟件
- 一款開(kāi)源的Python一鍵搶票神器詳細(xì)配置
- python爬蟲(chóng)實(shí)現(xiàn)最新12306搶票
- python3顯式變量類(lèi)型typing的實(shí)現(xiàn)
- Python爬蟲(chóng) 12306搶票開(kāi)源代碼過(guò)程詳解
- python并發(fā)編程多進(jìn)程 模擬搶票實(shí)現(xiàn)過(guò)程
- Python實(shí)現(xiàn)12306火車(chē)票搶票系統(tǒng)
- python+splinter自動(dòng)刷新?lián)屍惫δ?/a>
- python+Splinter實(shí)現(xiàn)12306搶票功能
- Python編寫(xiě)一個(gè)多線程的12306搶票程序的示例
相關(guān)文章
已安裝Pytorch卻提示no?moudle?named?'torch'(沒(méi)有名稱(chēng)為torch
這篇文章主要給大家介紹了關(guān)于已安裝Pytorch卻提示no?moudle?named?'torch'(沒(méi)有名稱(chēng)為torch的模塊)的相關(guān)資料,當(dāng)提示"No module named 'torch'"時(shí),可能是由于安裝的Pytorch版本與當(dāng)前環(huán)境不匹配導(dǎo)致的,需要的朋友可以參考下2023-11-11基于python實(shí)現(xiàn)MQTT發(fā)布訂閱過(guò)程原理解析
這篇文章主要介紹了基于python實(shí)現(xiàn)MQTT發(fā)布訂閱過(guò)程原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Python實(shí)現(xiàn)24點(diǎn)小游戲
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)24點(diǎn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09解決python便攜版無(wú)法直接運(yùn)行py文件的問(wèn)題
這篇文章主要介紹了解決python便攜版無(wú)法直接運(yùn)行py文件的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09python通過(guò)nmap掃描在線設(shè)備并嘗試AAA登錄(實(shí)例代碼)
這篇文章主要介紹了python通過(guò)nmap掃描在線設(shè)備并嘗試AAA登錄,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python實(shí)現(xiàn)修改文件內(nèi)容的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)修改文件內(nèi)容的方法,結(jié)合實(shí)例形式分析了Python文件讀寫(xiě)、字符串替換及shell方法調(diào)用等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03一文讓你秒懂精通pip并快速體驗(yàn)深度學(xué)習(xí)應(yīng)用【建議收藏】
在使用python的時(shí)候,經(jīng)常使用到pip這個(gè)工具,可以很方便的線上安裝依賴(lài)庫(kù),當(dāng)然pip還有很多參數(shù)都可以幫我們?nèi)ゲ樵?xún)一些庫(kù)信息,這篇文章主要給大家介紹了如何通過(guò)一篇文章讓你秒懂精通pip并快速體驗(yàn)深度學(xué)習(xí)應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-08-08分享5個(gè)方便好用的Python自動(dòng)化腳本
這篇文章主要介紹了分享5個(gè)方便好用的Python自動(dòng)化腳本,這次我們使用Python來(lái)實(shí)現(xiàn)幾個(gè)自動(dòng)化場(chǎng)景,或許可以用到你的工作中或者對(duì)你的學(xué)習(xí)有所幫助,需要的朋友可以參考一下2022-03-03