Python爬虫实战教程:自动化抢票脚本实战解析——以某麦网为例

1. 脚本介绍

1.1 背景介绍

在这个数字化时代,演唱会、体育赛事和各种活动的门票销售往往在线上进行。由于热门活动的高需求和门票的有限供应,抢票成为了一场激烈的竞争。许多粉丝和爱好者经常因为手速不够快或网络延迟而错失购票机会。为了提高抢票的成功率,自动化抢票脚本应运而生。

以下这个脚本是一个用 Python 编写的自动化抢票程序,利用Selenium库来模拟用户在网页上的操作。下面是脚本的详细功能和结构介绍:

1.2 脚本目的:

脚本的主要目的是在票务网站上自动购买演唱会或活动门票。它可以在指定的时间自动执行购票流程,从而提高抢票成功的概率。

1.3 主要功能:

  1. 登录:自动输入用户名和密码登录票务网站。
  2. 选择票价和数量:自动选择指定的票价,并增加购买数量。
  3. 选择购票人:在购票流程中选择预设的购票人信息。
  4. 提交订单:完成选择后自动提交订单。

1.4 结构和关键函数:

  • 导入库:脚本开始处导入了Selenium相关的库,用于浏览器控制和元素交互。
  • 设置参数:定义了抢票的URL、开票时间、用户名等参数。
  • 浏览器初始化:创建了一个Chrome浏览器的实例。
  • 等待时间设置:设置了一个WebDriverWait实例,用于等待网页元素加载。
  • 1.4.1 PC端抢票操作:
  • choose函数:用于查找并返回网页元素,如果元素不存在或无法点击,则返回None
  • login函数:用于执行登录操作。
  • buy函数:包含了抢票的主要步骤,如选择票价、数量、购票人,最后提交订单。
  • test函数:用于测试登录和抢票流程。
  • 移动端抢票操作:
  • login_mobile函数:用于移动端的登录操作。
  • buy_mobile函数:包含了移动端抢票的步骤。
  • test_mobile函数:用于测试移动端的登录和抢票流程。
  • 1.4.2 主函数:
  • main函数:是脚本的入口点,默认执行PC端的抢票流程,但可以通过注释切换到移动端或测试模式。
  • 1.5 注意事项:

  • 安全性:脚本中包含了用户名和密码,应当妥善保管,避免泄露。
  • 密码输入:由于密码输入框可能不可见,脚本中注释提到需要手动输入密码。
  • 异常处理:脚本包含了基本的异常处理,用于处理元素找不到或点击失败的情况。
  • 定时抢票:脚本通过一个无限循环和条件判断来实现定时抢票功能。
  • 1.6 使用方法:

    要使用这个脚本,用户需要安装Selenium库和一个对应的WebDriver(如ChromeDriver),并设置好相关参数,如抢票链接、用户名和密码。

    如未安装Selenium库:

    pip install Selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    附注: 自动化抢票脚本可能违反了某些网站的服务条款,使用前应确保了解相关法律和规定,不得违反任何法律或规定,本文仅供学习参考!此外,使用此类脚本可能对其他用户不公平,应当谨慎使用!

    2. 代码实现

    """
    基于python和selenium实现的某麦网自动刷新抢票脚本
    用户要提前添加好个人信息和收货地址
    """
    
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException
    import time
    
    # 设置抢票链接和开票时间
    
    # URL = "https://piao.damai.cn/146290.html?spm=a2o6e.search.0.0.7e2b4d157EDtjL"# PC页面
    
    URL = 'http://m.damai.cn/damai/perform/item.html?projectId=146290'#手机页面
    # HOUR = 19
    MIN  = 0
    USERNAME = "13112390306"
    
    driver = webdriver.Chrome()
    # 设置等待时间
    wait = WebDriverWait(driver, 5)
    driver.get(URL)
    
    """
    PC端网页抢票操作
    """
    def choose(seletor):
        try:
            # 控件可点击时才选定
            choice = wait.until(EC.element_to_be_clickable((By.XPATH, seletor)))
            return choice
        except TimeoutException as e:
            print("Time out!")
            return None
        except Exception:
            print("Not found!")
            return None
    
    def login():
        # 点击登录
        login = choose('//*[@id="userLoginInfo"]/span/a[1]')
        login.click()
        username = choose('//*[@id="login_email"]')
        username.send_keys(USERNAME)
        """
        由于密码框控件被设置为不可见
        先自行输入密码并记住密码
        方便刷新
        (也可用cookie实现)
        """
        password = choose('//*[@id="login_pwd_txt"]')
        try:
            password.click()
            password.send_keys("********")
        except Exception:
            print(password)
            print("Password Can't click")
    
    def buy():
        # 点击价格
        try:
            price = None
            plus = None
            buybtn = None
            submit = None
            booker = None
            select = None
            confirm = None
            driver.get(URL)
            # 选择价格
            while None == price:
                # 这里选的是580票面的,如果选其他票面,修改最后的li[*]即可
                price = choose('//*[@id="priceList"]/div/ul/li[3]')
            price.click()
            # 数量加1
            while None == plus:
                plus = choose('//*[@id="cartList"]/div[1]/ul/li/span[3]/a[2]')
            plus.click()
            # 立即抢购
            while None == buybtn:
                buybtn = choose('//*[@id="btnBuyNow"]')
            driver.execute_script("arguments[0].scrollIntoView();", buybtn) 
            buybtn.click()
            # 选择购票人
            while None == booker:
                booker = choose('/html/body/div[3]/div[3]/div[2]/div[2]/div/a')
            driver.execute_script("arguments[0].scrollIntoView();", booker) 
            booker.click()
            # 选择、确定
            while None == select:
                select = choose('/html/body/div[3]/div[3]/div[12]/div/div[2]/div/div[2]/div/table/tbody/tr/label/td[1]/input')
            driver.execute_script("arguments[0].scrollIntoView();", select) 
            select.click()
            while None == confirm:
                confirm = choose('/html/body/div[3]/div[3]/div[12]/div/div[2]/div/p/div/a')
            driver.execute_script("arguments[0].scrollIntoView();", confirm) 
            confirm.click()
            # 提交订单
            while None == submit:
                submit = choose('//*[@id="orderConfirmSubmit"]')
            driver.execute_script("arguments[0].scrollIntoView();", submit) 
            submit.click()
        except Exception:
            print("抢票失败,尝试重新抢票")
            buy()
    
    def test():
        login()
        time.sleep(30)
        print("开始抢票")
        buy()
        print("抢票成功")
    
    
    """
    移动端抢票操作
    """
    
    def login_mobile():
        """
        点击购买进入登录界面
        自行输入帐号密码
        """
        # 立即购买
        buybtn = None
        while None == buybtn:
            buybtn = choose('/html/body/div[1]/div[2]/div/div[1]/div[2]/div')
        driver.execute_script("arguments[0].scrollIntoView();", buybtn) 
        buybtn.click()
        # 默认已经选好时间了,再点击立即购买
        buy = None
        while None == buy:
            buy = choose('/html/body/div[1]/div[3]/div[2]/div[1]/div')
        driver.execute_script("arguments[0].scrollIntoView();", buy) 
        buy.click()
    
    def buy_mobile():
        try:
            # 立即购买
            buybtn = None
            while None == buybtn:
                buybtn = choose('/html/body/div[1]/div[2]/div/div[1]/div[2]/div')
            driver.execute_script("arguments[0].scrollIntoView();", buybtn) 
            buybtn.click()
            # 默认已经选好时间了,再点击立即购买
            buy = None
            while None == buy:
                buy = choose('/html/body/div[1]/div[3]/div[2]/div[1]/div')
            driver.execute_script("arguments[0].scrollIntoView();", buy) 
            buy.click()
            # 580票面
            price = None
            while None == price:
                price = choose('//html/body/div[1]/div/div[2]/ul/li[3]')
            driver.execute_script("arguments[0].scrollIntoView();", price) 
            price.click()
            # 数量+1
            count = None
            while None == count:
                count = choose('/html/body/div[1]/div/div[3]/ul/li/div/div[3]')
            driver.execute_script("arguments[0].scrollIntoView();", count) 
            count.click()
            # 选好了
            select = None
            while None == select:
                select = choose('/html/body/div[1]/div/div[4]/div[3]')
            driver.execute_script("arguments[0].scrollIntoView();", select) 
            select.click()
            # 购票人
            booker = None
            while None == booker:
                booker = choose('/html/body/div[1]/div[1]/div[2]/div[1]/div[2]/div/ul/li/div')
            driver.execute_script("arguments[0].scrollIntoView();", booker) 
            booker.click()
            # 去付款
            pay = None
            while None == pay:
                pay = choose('/html/body/div[1]/div[2]/div[2]/div[2]/div')
            driver.execute_script("arguments[0].scrollIntoView();", pay) 
            pay.click()
        except Exception:
            print("抢票失败,尝试重新抢票")
            buy_mobile()
    
    def test_mobile():
        login_mobile()
        time.sleep(30)
        print("开始抢票")
        buy_mobile()
        print("抢票成功")
    
    def main():
        # 默认 PC 网页,手机网页对应修改即可
        login()
        # 30秒等待用户输入密码后再开始刷
        time.sleep(30)
        while 1:
            if MIN == time.localtime().tm_min:
                print("开始抢票")
                buy()
                print("抢票成功")
    
    if __name__ == '__main__':
        # test()
        test_mobile()
        # main()
    

    作者:Ustinian_310

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python爬虫实战教程:自动化抢票脚本实战解析——以某麦网为例

    发表回复