為了順利買到演唱會(huì)的票用Python制作了自動(dòng)搶票的腳本
知識(shí)點(diǎn):
- 面向?qū)ο缶幊?/li>
- selenium 操作瀏覽器
- pickle 保存和讀取Cookie實(shí)現(xiàn)免登陸
- time 做延時(shí)操作
- os 創(chuàng)建文件,判斷文件是否存在
開發(fā)環(huán)境:
- 版 本:anaconda5.2.0(python3.6.5)
- 編輯器:pycharm
【付費(fèi)VIP完整版】只要看了就能學(xué)會(huì)的教程,80集Python基礎(chǔ)入門視頻教學(xué)
先導(dǎo)入本次所需的模塊
import os import time import pickle from time import sleep from selenium import webdriver
第一步,實(shí)現(xiàn)免登錄
確定目標(biāo),設(shè)置全局變量
# 大麥網(wǎng)主頁 damai_url = "https://www.damai.cn/" # 登錄頁 login_url = "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F" # 搶票目標(biāo)頁 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)-全球演出賽事官方購票平臺(tái)') != -1:
sleep(1)
print('###請(qǐng)掃碼登錄###')
while self.driver.title != '大麥網(wǎng)-全球演出賽事官方購票平臺(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)
登錄
def login(self):
if self.login_method==0:
self.driver.get(login_url)
# 載入登錄界面
print('###開始登錄###')
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()
打開瀏覽器
def enter_concert(self):
"""打開瀏覽器"""
print('###打開瀏覽器,進(jìn)入大麥網(wǎng)###')
# self.driver.maximize_window() # 最大化窗口
# 調(diào)用登陸
self.login() # 先登錄再說
self.driver.refresh() # 刷新頁面
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("###開始進(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('###搶票未開始,刷新等待開始###')
continue
elif buybutton == "立即預(yù)定":
self.driver.find_element_by_class_name('buybtn').click()
# 改變現(xiàn)有狀態(tài)
self.status = 3
elif buybutton == "立即購買":
self.driver.find_element_by_class_name('buybtn').click()
# 改變現(xiàn)有狀態(tài)
self.status = 4
# 選座購買暫時(shí)無法完成自動(dòng)化
elif buybutton == "選座購買":
self.driver.find_element_by_class_name('buybtn').click()
self.status = 5
except:
print('###未跳轉(zhuǎn)到訂單結(jié)算界面###')
title = self.driver.title
if title == '選座購買':
# 實(shí)現(xiàn)選座位購買的邏輯
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 == '選座購買':
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('###開始確認(rèn)訂單###')
try:
# 默認(rèn)選第一個(gè)購票人信息
self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
except Exception as e:
print("###購票人信息選中失敗,自行查看元素位置###")
print(e)
# 最后一步提交訂單
time.sleep(0.5) # 太快會(huì)影響加載,導(dǎo)致按鈕點(diǎn)擊無效
self.driver.find_element_by_xpath('//div[@class = "w1200"]//div[2]//div//div[9]//button[1]').click()
搶票完成,退出
def finish(self):
self.driver.quit()
測(cè)試代碼是否成功
if __name__ == '__main__':
try:
con = Concert() # 具體如果填寫請(qǐng)查看類中的初始化函數(shù)
con.enter_concert() # 打開瀏覽器
con.choose_ticket() # 開始搶票
except Exception as e:
print(e)
con.finish()
最后看下效果如何

到此這篇關(guān)于為了順利買到演唱會(huì)的票用Python制作了自動(dòng)搶票的腳本的文章就介紹到這了,更多相關(guān)Python 自動(dòng)搶票內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)蟻群優(yōu)化算法的示例代碼
蟻群算法是一種源于大自然生物世界的新的仿生進(jìn)化算法,本文主要介紹了Python如何實(shí)現(xiàn)蟻群算法,文中通過示例代碼具有一定的參考價(jià)值,感興趣的小伙伴們可以了解一下2023-08-08
python 計(jì)算數(shù)據(jù)偏差和峰度的方法
今天小編就為大家分享一篇python 計(jì)算數(shù)據(jù)偏差和峰度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python?Web?App開發(fā)Dockerfiles編寫示例
這篇文章主要為大家介紹了Python?Web?App編寫Dockerfiles的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
使用Python開發(fā)一個(gè)帶EPUB轉(zhuǎn)換功能的Markdown編輯器
Markdown因其簡單易用和強(qiáng)大的格式支持,成為了寫作者、開發(fā)者及內(nèi)容創(chuàng)作者的首選格式,本文將通過Python開發(fā)一個(gè)Markdown編輯器并帶有帶EPUB轉(zhuǎn)換功能,感興趣的小伙伴可以參考一下2025-04-04
pytorch使用nn.Moudle實(shí)現(xiàn)邏輯回歸
這篇文章主要為大家詳細(xì)介紹了pytorch使用nn.Moudle實(shí)現(xiàn)邏輯回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Python time模塊詳解(常用函數(shù)實(shí)例講解,非常好)
在平常的代碼中,我們常常需要與時(shí)間打交道。在Python中,與時(shí)間處理有關(guān)的模塊就包括:time,datetime以及calendar。這篇文章,主要講解time模塊。2014-04-04
python 從遠(yuǎn)程服務(wù)器下載日志文件的程序
本文提供了一種方法,該程序可實(shí)現(xiàn)抓取服務(wù)器的日志文件到本地,根據(jù)該程序可自行擴(kuò)展對(duì)日志文件的自動(dòng)化分析。常用于數(shù)據(jù)挖掘、生產(chǎn)維護(hù)等2013-02-02

