首页 > 编程语言 >【Python】自动化抢票脚本【某麦网】

【Python】自动化抢票脚本【某麦网】

时间:2024-07-14 17:29:06浏览次数:10  
标签:None buy Python 抢票 某麦网 choose div click

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

标签:None,buy,Python,抢票,某麦网,choose,div,click
From: https://blog.csdn.net/Young_Pro/article/details/140419315

相关文章

  • Python函数(1)--自定义函数与作用域
    函数的定义Python中的函数是一段组织好的、可重复使用的、用来实现单一或相关联功能的代码块。函数能提高应用的模块性,和代码的重复可用性。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被称为用户自定义函数。自定义函数假设,我们现在求一......
  • python 基础 九 Chorme handless
    ChromehandlessChromehandless模式,Google针对Chrome浏览器59版新增的一种模式,可以让你不打开UI界面的情况下使用Chrome浏览器,所以运行效果与Chrome保持完美一致Chromehandless的系统要求1、Chrome版本要求Unix/Linux系统要求chrome>=59Windows系统需要......
  • 01-python基础
    DAY-01课堂笔记为后续的自动化测试打基础python+requests:接口自动化python+selenium:web自动化python+appium:移动端自动化python是解释型语言下方代码的错误不会影响上方代码的执行主流版本:python3基础语法注释:对代码进行解释说明快捷键:ctrl+/单行注释:#......
  • 一劳永逸解决路径难题:PyCharm中Python解释器路径错误的终极指南
    一劳永逸解决路径难题:PyCharm中Python解释器路径错误的终极指南引言PyCharm作为Python开发者的强大IDE,提供了许多便利的功能来简化开发流程。然而,在使用PyCharm时,可能会遇到Python解释器路径错误的问题,这通常会导致项目无法正常运行或调试。本文将提供一份详尽的指南,帮助......
  • 《0基础》学习Python——第十讲
    小知识点补充一、json大字符串        JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它以易于阅读和编写的方式为基础,同时也易于解析和生成。因为其简洁性和可读性,JSON已成为数据交换的首选格式。        大字符串是指包含大量数据的字符串。......
  • Python+wxauto=微信自动化?
    Python+wxauto=微信自动化?一、wxauto库简介1.什么是wxauto库        wxauto是一个基于UIAutomation的开源Python微信自动化库。它旨在帮助用户通过编写Python脚本,轻松实现对微信客户端的自动化操作,从而提升效率并满足个性化需求。这一工具的出现,为经常需要在电脑......
  • Python数据容器(3)--遍历与列表生成式
    文章目录遍历直接遍历索引遍历list列表tuple元组字典遍历get()方法items()方法enumerate()函数与zip()函数enumerate()函数zip()函数列表生成式语法表现形式编写基本的列表生成式带有条件的列表生成式嵌套列表生成式字符串与列表之间的转换总结遍历:列表生成式遍......
  • python接口自动化(二十五)--unittest断言——下(详解)
    1.简介 本篇还是回归到我们最初始的话题,想必大家都忘记了,没关系看这里:传送门 没错最初的话题就是登录,由于博客园的登录机制改变了,本篇以我找到的开源免费的登录API为案例,结合unittest框架写2个用例。同样我们先来看一下接口文档。2.接口文档2.1登录接口请求方式......
  • 手机上也能玩 Python,随时撸代码!
    手机编程软件有很多,大部分都很难使用,操作不灵活,甚至不能安装第三方库。尝试安装了很多Python移动编程软件,发现了很多问题,不是编码效率低就是各种bug。今天,来自一位python编程小哥指导,向大家推荐两款精心挑选的手机编程软件,它们也是非常成熟的手机编程工具。QPythonOHQpyt......
  • 【python基础】常见的运算符
    一、常见的逻辑运算符1、逻辑“与”运算符---andand对符号两侧的值进行与运算,只有两侧均为True时候最终结果才为True,与运算主要找False,如果第一个值为False,则不在运算第二个值>>>print(0and1)0>>>aa=1andprint('23')23>>>aa=0andprint('23')>>>>>>......