最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教你用Python來(lái)制作一個(gè)自動(dòng)搶票的腳本小程序

 更新時(shí)間:2023年07月30日 16:59:21   作者:魔王不會(huì)哭  
大麥網(wǎng),是中國(guó)綜合類現(xiàn)場(chǎng)娛樂(lè)票務(wù)營(yíng)銷平臺(tái),業(yè)務(wù)覆蓋演唱會(huì)、 話劇、音樂(lè)劇、體育賽事等領(lǐng)域,但是因?yàn)槠睌?shù)有限,還有黃牛們不能丟了飯碗,所以導(dǎo)致了,很多人都搶不到票,那么,今天帶大家用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):
![請(qǐng)?zhí)砑訄D片描述](https://img-blog.csdnimg.cn/4a0b661782e24b8ebf46390fb2333452.gif)
    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)文章!

相關(guān)文章

  • PyTorch中改變張量形狀的幾種方法小結(jié)

    PyTorch中改變張量形狀的幾種方法小結(jié)

    在深度學(xué)習(xí)領(lǐng)域,PyTorch 是一個(gè)廣泛使用的框架,它提供了豐富的API來(lái)處理張量(tensor),在模型開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要改變張量的形狀以滿足特定的需求,本文將介紹在 PyTorch 中改變張量形狀的幾種方法,需要的朋友可以參考下
    2025-02-02
  • Conda環(huán)境導(dǎo)出與導(dǎo)入的實(shí)現(xià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中函數(shù)參數(shù)匹配模型詳解

    Python中函數(shù)參數(shù)匹配模型詳解

    這篇文章主要介紹了Python函數(shù)參數(shù)匹配模型,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Python PyQt5實(shí)戰(zhàn)項(xiàng)目之文件拷貝器的具體實(shí)現(xiàn)詳解

    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)鍵詞的方法

    這篇文章主要介紹了python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法,可實(shí)現(xiàn)針對(duì)文件夾及文件內(nèi)關(guān)鍵詞的搜索功能,需要的朋友可以參考下
    2015-06-06
  • Python中的復(fù)制、淺拷貝與深拷貝解讀

    Python中的復(fù)制、淺拷貝與深拷貝解讀

    這篇文章主要介紹了Python中的復(fù)制、淺拷貝與深拷貝解讀,對(duì)于可變對(duì)象,賦值是最簡(jiǎn)單省事的,如b=a,意思是直接使得a指向b代表的對(duì)象,兩者id一樣,指向同一個(gè)對(duì)象,一個(gè)修改,另一個(gè)也隨之變化,需要的朋友可以參考下
    2023-11-11
  • Pycharm中無(wú)法使用pip安裝的包問(wèn)題解決方案

    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)之德州撲克第二步-判斷牌型

    這篇文章主要介紹了python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • python語(yǔ)法筆記之Python?raise語(yǔ)句用法詳解

    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)題

    今天小編就為大家分享一篇解決python寫(xiě)入帶有中文的字符到文件錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

杭锦旗| 沈阳市| 曲周县| 桓台县| 穆棱市| 大荔县| 堆龙德庆县| 尚义县| 屏山县| 九江市| 南和县| 安溪县| 宜州市| 万年县| 夹江县| SHOW| 仲巴县| 依兰县| 武冈市| 天津市| 嵊泗县| 龙南县| 佛山市| 南宫市| 偏关县| 永清县| 沐川县| 合作市| 塔河县| 富锦市| 康平县| 绥中县| 和平区| 合水县| 朔州市| 天津市| 嘉善县| 卓资县| 崇文区| 洛扎县| 恩平市|