绪论

近日小编同事很想去看某明星的演唱会,但苦于一票难求,同时网上的抢票代码和教程和目前的大麦网目前的网站抢票流程也有较大的变化,所以小编就想分享一下自己的抢票思路,希望大佬们多多指点。

一、源码实例如下

#加载包
from selenium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException

#输入你想抢票的网址;注:网站连接应从手机端复制连接(因为当前的网页大麦网不支持购票)
url = 'https://m.damai.cn/damai/detail/item.html?utm=&itemId=720336645935&from=appshare'
# 声明浏览器(这里用chrome浏览器)
options = webdriver.ChromeOptions()
# 就是这一行告诉chrome去掉了webdriver痕迹,令navigator.webdriver=false,极其关键
options.add_argument("--disable-blink-features=AutomationControlled")
# 还有其他options配置,此处和问题无关,略去
browser = webdriver.Chrome(options=options)
# get打开指定的url,传入要打开的url,以淘宝网为例
browser.get(url)
#延迟0.9秒执行代码
time.sleep(0.9)
browser.find_element("class name", 'buy__button').click()  # 成功
time.sleep(1)
browser.find_element("class name","bui-dm-sku-card-item.item-normal-favor.theme-normal").click()
time.sleep(0.5)
browser.find_element("xpath","/html/body/div[6]/div[2]/div/div/div/div/div[3]/div[2]/div[1]").click()
browser.find_element("class name",
                     "bui-btn.bui-btn-contained.bui-btn-medium.sku-footer-buy-button."
                     "full-width.normal.sku-footer-buy-button").click()

#进入第二层嵌套页面;因为实际输入框存在于网页的嵌套页面所以必需进入第二层页面才能够点击到
time.sleep(1.5)
browser.switch_to.frame(0)
time.sleep(2)
browser.find_element("xpath",'//*[@id="login-form"]/div[5]/a[1]').click()
time.sleep(2)
browser.find_element("xpath", '//*[@id="fm-login-id"]').send_keys('18019159873')  # 输入账号
time.sleep(2)
browser.find_element("xpath", '//*[@id="fm-login-password"]').send_keys('060301110-Gmh')  # 输入账号
time.sleep(2)
browser.find_element("xpath",'//*[@id="login-form"]/div[4]/button').click()
time.sleep(1)

# 制作判断按钮和循环点击实现
while True:
    try:
        browser.refresh()
        time.sleep(0.2)
        # 点击购买按钮
        browser.find_element("class name", 'buy__button').click()  # 成功
        time.sleep(0.1)
        # 成功点击购买按钮后停留 1 秒,等待购买弹窗加载完成
        # 判断是否存在购买弹窗
        try:
            browser.find_element("class name", "bui-dm-sku-card-item.item-normal-favor.theme-normal").click()
            #继续购买
            time.sleep(0.1)
            try:
                browser.find_element("class name",
                                         "bui-btn.bui-btn-contained.bui-btn-medium.sku-footer-buy-button"
                                         ".full-width.normal.sku-footer-buy-button").click()
                time.sleep(0.1)  # 选择人员
                browser.find_element("xpath",
                                 '//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div[4]/div[3]/i').click()  # 成功
                time.sleep(0.5)  # 提交订单
                browser.find_element("xpath",
                         '//*[@id="dmOrderSubmitBlock_DmOrderSubmitBlock"]/'
                         'div[2]/div/div[2]/div[3]/div[2]').click()  # 成功
                break
            except:
                browser.refresh()
                time.sleep(0.1)
                pass
        except:
            pass
    except:
        print("进入循环")
        while True:
            try:
                browser.refresh()
                time.sleep(0.2)
                # 点击购买按钮
                browser.find_element("class name", 'buy__button').click()  # 成功
                time.sleep(0.1)
                # 成功点击购买按钮后停留 1 秒,等待购买弹窗加载完成
                # 判断是否存在购买弹窗
                try:
                    browser.find_element("class name", "bui-dm-sku-card-item.item-normal-favor.theme-normal").click()
                    # 继续购买
                    time.sleep(0.1)
                    try:
                        browser.find_element("class name",
                                             "bui-btn.bui-btn-contained.bui-btn-medium.sku-footer-buy-button"
                                             ".full-width.normal.sku-footer-buy-button").click()
                        time.sleep(0.1)  # 选择人员
                        browser.find_element("xpath",
                                             '//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div[4]/div[3]/i').click()  # 成功
                        time.sleep(0.5)  # 提交订单
                        browser.find_element("xpath",
                                             '//*[@id="dmOrderSubmitBlock_DmOrderSubmitBlock"]/'
                                             'div[2]/div/div[2]/div[3]/div[2]').click()  # 成功
                        break
                    except:
                        browser.refresh()
                        time.sleep(0.1)
                        pass
                except:
                    pass
            except:
                print("进入内循环")
                break

二、程序编码成功后操作流程

        2.1 将源码转化为可执行程序

        为了方便没有python环境的用户执行抢票程序,将编码好的程序打包为一个.exe(可执行程序),使得双击则可在任何window系统上执行程序,具体操作流程如下链接如何将python代码转化为exe

        2.2 设置电脑定时执行exe程序(也可手动运行)

        手动运行:在开始抢票的前30秒开始运行程序,程序开始登录网站页面并开始自动刷新抢票。

        设置电脑自动运行程序:因为大麦网抢票需要在一定的时间限制内才能开始抢票,所以需要让计算机定时执行python代码,让电脑自动执行抢票程序。如何实现电脑自动定时运行程序,(游览的位置应该是小程序存放的地址)