教你用Python來(lái)制作一個(gè)自動(dòng)搶票的腳本小程序
此次知識(shí)點(diǎn):
- 面向?qū)ο缶幊?/li>
- selenium 操作瀏覽器
- pickle 保存和讀取Cookie實(shí)現(xiàn)免登陸
- time 做延時(shí)操作
- os 創(chuàng)建文件,判斷文件是否存在
開(kāi)發(fā)環(huán)境:
- 版 本:anaconda5.2.0(python3.6.5)
- 編輯器:pycharm
python安裝包 安裝教程視頻
pycharm 社區(qū)版 專業(yè)版 及 激活碼
視頻教程
第三方庫(kù):
- selenium >>> pip install selenium==3.4.1
步驟
實(shí)現(xiàn)免登陸
第一次登陸的時(shí)候 會(huì)幫助我記錄我們的登陸信息
set_cookie 登陸成功之后 cookie會(huì)發(fā)生變化
后續(xù)搶票: 直接使用我們記錄好的登陸信息
get_cookie搶票并且下單
首先導(dǎo)入本次所需的模塊
from selenium import webdriver # 操作谷歌瀏覽器 需要額外安裝的 并且現(xiàn)在安裝這個(gè)模塊得指定版本 3.4 from time import sleep import pickle # 保存和讀取cookie實(shí)現(xiàn)免登錄的工具 import os # 操作文件的模塊
第一步,實(shí)現(xiàn)免登錄
確定目標(biāo),設(shè)置全局變量
# 大麥網(wǎng)主頁(yè) damai_url = "https://www.damai.cn/" # 登錄頁(yè) login_url = "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F" # 搶票目標(biāo)頁(yè) target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.search_category.0.0.77f24d15RWgT4o&id=654534889506&clicktitle=%E5%A4%A7%E4%BC%97%E7
初始化加載
class Concert:
def __init__(self):
self.status = 0 # 狀態(tài),表示如今進(jìn)行到何種程度
self.login_method = 1 # {0:模擬登錄,1:Cookie登錄}自行選擇登錄方式
self.driver = webdriver.Chrome(executable_path='chromedriver.exe') # 默認(rèn)Chrome瀏覽器登錄調(diào)用設(shè)置cookie
def set_cookie(self):
self.driver.get(damai_url)
print("###請(qǐng)點(diǎn)擊登錄###")
while self.driver.title.find('大麥網(wǎng)-全球演出賽事官方購(gòu)票平臺(tái)') != -1:
sleep(1)
print('###請(qǐng)掃碼登錄###')
while self.driver.title != '大麥網(wǎng)-全球演出賽事官方購(gòu)票平臺(tái)-100%正品、先付先搶、在線選座!':
sleep(1)
print("###掃碼成功###")
pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))
print("###Cookie保存成功###")
self.driver.get(target_url)獲取cookie
def get_cookie(self):
try:
cookies = pickle.load(open("cookies.pkl", "rb")) # 載入cookie
for cookie in cookies:
cookie_dict = {
'domain':'.damai.cn', # 必須有,不然就是假登錄
'name': cookie.get('name'),
'value': cookie.get('value')
}
self.driver.add_cookie(cookie_dict)
print('###載入Cookie###')
except Exception as e:
print(e)開(kāi)始登錄
def login(self):
if self.login_method==0:
self.driver.get(login_url)
# 載入登錄界面
print('###開(kāi)始登錄###')
elif self.login_method==1:
if not os.path.exists('cookies.pkl'):
# 如果不存在cookie.pkl,就獲取一下
self.set_cookie()
else:
self.driver.get(target_url)
self.get_cookie()打開(kāi)瀏覽器
def enter_concert(self):
"""打開(kāi)瀏覽器"""
print('###打開(kāi)瀏覽器,進(jìn)入大麥網(wǎng)###')
# self.driver.maximize_window() # 最大化窗口
# 調(diào)用登陸
self.login() # 先登錄再說(shuō)
self.driver.refresh() # 刷新頁(yè)面
self.status = 2 # 登錄成功標(biāo)識(shí)
print("###登錄成功###")
# 后續(xù)德云社可以講
if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):
self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()第二步,搶票并下單
判斷元素是否存在
def isElementExist(self, element):
flag = True
browser = self.driver
try:
browser.find_element_by_xpath(element)
return flag
except:
flag = False
return flag選票
def choose_ticket(self):
if self.status == 2: #登錄成功入口
print("="*30)
print("###開(kāi)始進(jìn)行日期及票價(jià)選擇###")
while self.driver.title.find('確認(rèn)訂單') == -1: # 如果跳轉(zhuǎn)到了訂單結(jié)算界面就算這步成功了,否則繼續(xù)執(zhí)行此步
try:
buybutton = self.driver.find_element_by_class_name('buybtn').text
if buybutton == "提交缺貨登記":
# 改變現(xiàn)有狀態(tài)
self.status=2
self.driver.get(target_url)
print('###搶票未開(kāi)始,刷新等待開(kāi)始###')
continue
elif buybutton == "立即預(yù)定":
self.driver.find_element_by_class_name('buybtn').click()
# 改變現(xiàn)有狀態(tài)
self.status = 3
elif buybutton == "立即購(gòu)買":
self.driver.find_element_by_class_name('buybtn').click()
# 改變現(xiàn)有狀態(tài)
self.status = 4
# 選座購(gòu)買暫時(shí)無(wú)法完成自動(dòng)化
elif buybutton == "選座購(gòu)買":
self.driver.find_element_by_class_name('buybtn').click()
self.status = 5
except:
print('###未跳轉(zhuǎn)到訂單結(jié)算界面###')
title = self.driver.title
if title == '選座購(gòu)買':
# 實(shí)現(xiàn)選座位購(gòu)買的邏輯
self.choice_seats()
elif title == '確認(rèn)訂單':
while True:
# 如果標(biāo)題為確認(rèn)訂單
print('waiting ......')
if self.isElementExist('//*[@id="container"]/div/div[9]/button'):
self.check_order()
break選擇想要座位
def choice_seats(self):
while self.driver.title == '選座購(gòu)買':
while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):
# 座位手動(dòng)選擇 選中座位之后//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img 就會(huì)消失
print('請(qǐng)快速的選擇您的座位?。?!')
# 消失之后就會(huì)出現(xiàn) //*[@id="app"]/div[2]/div[2]/div[2]/div
while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):
# 找到之后進(jìn)行點(diǎn)擊確認(rèn)選座
self.driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/button').click()下單
def check_order(self):

if self.status in [3,4,5]:
print('###開(kāi)始確認(rèn)訂單###')
try:
# 默認(rèn)選第一個(gè)購(gòu)票人信息
self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
except Exception as e:
print("###購(gòu)票人信息選中失敗,自行查看元素位置###")
print(e)
# 最后一步提交訂單
time.sleep(0.5) # 太快會(huì)影響加載,導(dǎo)致按鈕點(diǎn)擊無(wú)效
self.driver.find_element_by_xpath('//div[@class = "w1200"]//div[2]//div//div[9]//button[1]').click()搶票成功, 退出當(dāng)前程序
def finish(self):
self.driver.quit()測(cè)試代碼
if __name__ == '__main__':
try:
con = Concert() # 具體如果填寫(xiě)請(qǐng)查看類中的初始化函數(shù)
con.enter_concert() # 打開(kāi)瀏覽器
con.choose_ticket() # 開(kāi)始搶票
except Exception as e:
print(e)
con.finish()效果

好了,我的這篇文章寫(xiě)到這里就結(jié)束啦!
希望你在python這條路上依心而行,別回頭,別四顧。一如既往不改初見(jiàn)的模樣,未來(lái)的路很長(zhǎng),不管怎樣,一定要相信自己一直走下去。
以上就是教你用Python來(lái)制作一個(gè)自動(dòng)搶票的腳本小程序的詳細(xì)內(nèi)容,更多關(guān)于Python自動(dòng)搶票腳本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 基于Python實(shí)現(xiàn)火車票搶票軟件
- 一款開(kāi)源的Python一鍵搶票神器詳細(xì)配置
- python爬蟲(chóng)實(shí)現(xiàn)最新12306搶票
- python3顯式變量類型typing的實(shí)現(xiàn)
- Python爬蟲(chóng) 12306搶票開(kāi)源代碼過(guò)程詳解
- python并發(fā)編程多進(jìn)程 模擬搶票實(shí)現(xiàn)過(guò)程
- Python實(shí)現(xiàn)12306火車票搶票系統(tǒng)
- python+splinter自動(dòng)刷新?lián)屍惫δ?/a>
- python+Splinter實(shí)現(xiàn)12306搶票功能
- 一百多行python代碼實(shí)現(xiàn)搶票助手
- Python編寫(xiě)一個(gè)多線程的12306搶票程序的示例
相關(guān)文章
Conda環(huán)境導(dǎo)出與導(dǎo)入的實(shí)現(xiàn)
本文主要介紹了Conda環(huán)境導(dǎo)出與導(dǎo)入的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python PyQt5實(shí)戰(zhàn)項(xiàng)目之文件拷貝器的具體實(shí)現(xiàn)詳解
PyQt5以一套Python模塊的形式來(lái)實(shí)現(xiàn)功能。它包含了超過(guò)620個(gè)類,600個(gè)方法和函數(shù)。本篇文章手把手帶你用PyQt5實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件拷貝器,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法
這篇文章主要介紹了python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法,可實(shí)現(xiàn)針對(duì)文件夾及文件內(nèi)關(guān)鍵詞的搜索功能,需要的朋友可以參考下2015-06-06
Pycharm中無(wú)法使用pip安裝的包問(wèn)題解決方案
本文主要介紹了Pycharm中無(wú)法使用pip安裝的包問(wèn)題解決方案,在終端通過(guò)pip裝好包以后,在pycharm中導(dǎo)入包時(shí),依然會(huì)報(bào)錯(cuò),下面就來(lái)介紹一下解決方法2023-09-09
python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型
這篇文章主要介紹了python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
python語(yǔ)法筆記之Python?raise語(yǔ)句用法詳解
在Python編程中raise語(yǔ)句是處理異常機(jī)制的核心組成部分,它賦予開(kāi)發(fā)者主動(dòng)拋出異常的能力,能夠精確地控制程序在特定條件下的行為,增強(qiáng)代碼的健壯性和可維護(hù)性,這篇文章主要介紹了python語(yǔ)法筆記之Python?raise語(yǔ)句用法的相關(guān)資料,需要的朋友可以參考下2026-01-01
解決python寫(xiě)入帶有中文的字符到文件錯(cuò)誤的問(wèn)題
今天小編就為大家分享一篇解決python寫(xiě)入帶有中文的字符到文件錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

