一百多行python代碼實(shí)現(xiàn)搶票助手
一. 代碼使用Python+Splinter開發(fā),Splinter是一個使用Python開發(fā)的開源Web應(yīng)用測試工具,它可以幫你實(shí)現(xiàn)自動瀏覽站點(diǎn)和與其進(jìn)行交互。
二. 安裝好Python 3或2都可以,然后安裝Splinter `pip install Splinter
三. Splinter注意事項(xiàng)
1. Splinter的Browser類默認(rèn)優(yōu)先使用firefox,所以用chrome的話,需要指定driver_name="chrome",只要養(yǎng)成一個習(xí)慣,不管用什么瀏覽器都指定,問題會出得少
2. 當(dāng)然,選擇chrome的話,需要查看自己瀏覽器的版本,需要和chromedriver版本對應(yīng)(不是版本號一致),參考和下載地址
四. Splinter.broser部分方法介紹
1. findbyid("控件id").first:根據(jù)id找到組件
2. visis(url):訪問指定網(wǎng)址
3. fill("填充的內(nèi)容"):用指定內(nèi)容填充組件
4. click():點(diǎn)擊事件
5. reload():重新加載當(dāng)前文檔
五. 主要思路:
1. 自動填充用戶名,密碼,點(diǎn)擊圖片驗(yàn)證碼(手動),自動點(diǎn)擊購票查詢,預(yù)訂,自動選擇指定乘客進(jìn)入提交訂單頁面
2. 除登錄時的圖片驗(yàn)證碼,全程自動
六. error(下面是我已經(jīng)嘗試成功的):
1. OSError: [WinError 193] %1 不是有效的 Win32 應(yīng)用程序。
2. 解決方案:chromedriver版本和電腦瀏覽器版本映射沒對應(yīng)
3. ImportError: cannot import name 'Browser'。
4. 解決方案:是否安裝了Splinter `pip install Splinter`,將代碼文件和chromedriver放到一個新文件夾下,防止其他文件的影響
5. 請?jiān)谶\(yùn)行文件前,將代碼內(nèi)的乘客,用戶名,密碼正確填寫好,檢查cookies是否正確
七. cookies 查看
1. 進(jìn)入chrome瀏覽器,按F12,選中NetWork選項(xiàng),如下圖
2. 起始地址:`_jc_save_fromStation` 購票時間:`_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=''
#用戶名 密碼
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則從上之下依次點(diǎn)擊
order = 0
###乘客姓名
users=[u'乘客名']
##席位
xb=u"二等座"
pz=u"成人票"
"""網(wǎng)址"""
#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("等待驗(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("購票頁面開始....")
#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("循環(huán)點(diǎn)擊查詢.... 第 %s 次"%count)
#sleep(1)
try:
self.driver.find_by_text(u'預(yù)訂')[self.order - 1].click()
except Exception as e:
print(e)
print("還沒開始預(yù)訂")
continue
else :
while self.driver.url == self.ticket_url:
self.driver.find_by_text(u"查詢").click()
count += 1
print("循環(huán)點(diǎ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("還沒開始預(yù)訂 %s "%count)
continue
print("開始預(yù)訂....")
#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("確認(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()
十. 源碼地址
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 教你用Python來制作一個自動搶票的腳本小程序
- 基于Python實(shí)現(xiàn)火車票搶票軟件
- 一款開源的Python一鍵搶票神器詳細(xì)配置
- python爬蟲實(shí)現(xiàn)最新12306搶票
- python3顯式變量類型typing的實(shí)現(xiàn)
- Python爬蟲 12306搶票開源代碼過程詳解
- python并發(fā)編程多進(jìn)程 模擬搶票實(shí)現(xiàn)過程
- Python實(shí)現(xiàn)12306火車票搶票系統(tǒng)
- python+splinter自動刷新?lián)屍惫δ?/a>
- python+Splinter實(shí)現(xiàn)12306搶票功能
- Python編寫一個多線程的12306搶票程序的示例
相關(guān)文章
Django關(guān)于admin的使用技巧和知識點(diǎn)
在本篇文章里小編給大家整理的是關(guān)于Django的admin簡單使用的相關(guān)知識點(diǎn)內(nèi)容,需要的朋友們可以跟著學(xué)習(xí)下。2020-02-02
matplotlib實(shí)現(xiàn)區(qū)域顏色填充
這篇文章主要為大家詳細(xì)介紹了matplotlib實(shí)現(xiàn)區(qū)域顏色填充,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
Python 無限級分類樹狀結(jié)構(gòu)生成算法的實(shí)現(xiàn)
這篇文章主要介紹了Python 無限級分類樹狀結(jié)構(gòu)生成算法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
django和vue實(shí)現(xiàn)數(shù)據(jù)交互的方法
今天小編就為大家分享一篇django和vue實(shí)現(xiàn)數(shù)據(jù)交互的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python實(shí)現(xiàn)批量導(dǎo)入1000條xlsx數(shù)據(jù)
本文主要介紹了Python實(shí)現(xiàn)批量導(dǎo)入1000條xlsx數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
PyQt5使用QTimer實(shí)現(xiàn)電子時鐘
這篇文章主要為大家詳細(xì)介紹了PyQt5使用QTimer實(shí)現(xiàn)電子時鐘,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

