1. 程式人生 > 其它 >Python selenium 實現大麥網自動搶票,簡單的實現全購票過程

Python selenium 實現大麥網自動搶票,簡單的實現全購票過程

前言

大麥網是中國綜合類現場娛樂票務營銷平臺,業務覆蓋演唱會、 話劇、音樂劇、體育賽事等領域
今天,我們要用程式碼來實現他的購票過程

先來看看完成後的效果是怎麼樣的

對於本篇文章有疑問的同學可以加【資料白嫖、解答交流群:753182387】

開發環境

  • 版 本:anaconda(python3.8.8)
  • 編輯器:pycharm

程式碼實現步驟

  • 實現免登陸
  • 選座並且下單

實現免登陸

damai_url = 'https://www.damai.cn/'
# 登入
login_url = 'https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F
' # 搶票目標頁 target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.search_category.0.0.6ee64d156yMCV9&id=672706937093&clicktitle=%E7%95%99%E5%A3%B0%E7%8E%A9%E5%85%B72022%E3%80%8C%E6%97%B6%E9%97%B4%E7%9A%84%E8%B7%A8%E5%BA%A6%E3%80%8D%E5%B7%A1%E6%BC%94Vol%C2%B71%20%E9%95%BF%E6%B2%99%E7%AB%99'
初始化載入
from
selenium import webdriver # 操作瀏覽器的工具 def __init__(self): self.status = 0 # 狀態, 表示當前操作執行到了哪個步驟 self.login_method = 1 # {0:模擬登入, 1:cookie登入}自行選擇登入的方式 self.driver = webdriver.Chrome(executable_path='chromedriver.exe') # 當前瀏覽器驅動物件

登入

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'): self.set_cookies() # 沒有檔案的情況下, 登入一下 else: self.driver.get(target_url) # 跳轉到搶票頁 self.get_cookie() # 並且登入

cookies: 登入網站時出現的

import time       

def set_cookies(self):
    self.driver.get(damai_url)
    print('###請點選登入###')
    # 我沒有點選登入,就會一直延時在首頁, 不會進行跳轉
    while self.driver.title.find('大麥網-全球演出賽事官方購票平臺') != -1:
        sleep(1)
    print('###請掃碼登入###')
    # 沒有登入成功
    while self.driver.title != '大麥網-全球演出賽事官方購票平臺-100%正品、先付先搶、線上選座!':
        sleep(1)
    print('###掃碼成功###')
    # get_cookies: driver裡面的方法
    pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))
    print('###cookie儲存成功###')
    self.driver.get(target_url)

假如說我現在本地有 cookies.pkl 那麼 直接獲取

def get_cookie(self):
    cookies = pickle.load(open('cookies.pkl', 'rb'))
    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###')

執行程式碼可以得到所需要的cookis,這樣就可以實現免登入

開啟瀏覽器

def enter_concert(self):
    print('###開啟瀏覽器,進入大麥網###')
    # 呼叫登入
    self.login()                # 先登入再說
    self.driver.refresh()       # 重新整理頁面
    self.status = 2             # 登入成功標識
    print('###登入成功###')
    # 處理彈窗
    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 choose_ticket(self):
    if self.status == 2:
        print('=' * 30)
        print('###開始進行日期及票價選擇###')
        while self.driver.title.find("確認訂單") == -1:
            try:
                buybutton = self.driver.find_element_by_class_name('buybtn').text
                if buybutton == '提交缺貨登記':
                    self.status = 2  # 沒有進行更改操作
                    self.driver.get(target_url)  # 重新整理頁面 繼續執行操作
                elif buybutton == '立即預定':
                    # 點選立即預定
                    self.driver.find_element_by_class_name('buybtn').click()
                    self.status = 3
                elif buybutton == '立即購買':
                    self.driver.find_element_by_class_name('buybtn').click()
                    self.status = 4
                elif buybutton == '選座購買':
                    self.driver.find_element_by_class_name('buybtn').click()
                    self.status = 5
            except:
                print('###沒有跳轉到訂單結算介面###')
            title = self.driver.title
            if title == '選座購買':
                # 選座購買的邏輯
                self.choice_seats()
            elif title == '確認訂單':
                # 實現下單的邏輯
                while True:
                    # 如果標題為確認訂單
                    print('正在載入.......')
                    # 如果當前購票人資訊存在 就點選
                    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'):
            print('請快速選擇你想要的座位!!!')
        while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):
            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('###開始確認訂單###')
        try:
            # 預設選第一個購票人資訊
            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)  # 太快了不好, 影響載入 導致按鈕點選無效
        self.driver.find_element_by_xpath('//*[@id="container"]/div/div[9]/button').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 finish(self):
    self.driver.quit()