当前位置: 首页 > article >正文

抢票神器:大麦网抢票实战教程

在这里插入图片描述

抢票神器:大麦网抢票实战教程

前提声明

  • 本教程旨在教授如何使用Python和Selenium进行网页自动化操作,不鼓励任何违反网站服务条款的行为。
  • 本代码仅供学习和研究使用,不得用于商业用途。
  • 请确保在合法合规的前提下使用本代码。
  • 本代码所涉及的操作均为模拟正常用户行为,不涉及任何非法入侵或数据窃取。

目录

  1. 引言
  2. 环境准备
  3. 代码结果
  4. 代码解析
    • 1. 抢票页面与登录
    • 2. 执行stealth脚本
    • 3. Cookie登录
    • 4. 打开浏览器与登录
    • 5. 选择票型
    • 6. 确认订单
    • 7. 支付宝支付
  5. 结语
  6. 全部代码

引言

在数字化时代,抢票成为了一项技术活。大麦网作为国内知名的票务平台,常常因为热门演出一票难求。本文将带你走进自动化抢票的世界,手把手教你如何使用Python和Selenium实现大麦网的自动化抢票。

环境准备

在开始之前,确保你的开发环境中安装了以下Python库:

  • selenium:用于网页自动化操作。
  • pickle:用于对象序列化。

如果尚未安装,可以通过以下命令进行安装:

pip install selenium

请确保你已经下载了对应浏览器的WebDriver,并将其路径添加到系统环境变量中。

代码解析

1. 抢票页面与登录

首先,我们定义了大麦网的主页、登录页和抢票目标页的URL。

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.home.card_0.ditem_1.2bbb23e1uo54LV&id=853329221023' 

2. 执行stealth脚本

为了模拟正常用户行为,避免被网站识别为机器人,我们使用stealth.min.js脚本来执行stealth操作。

@staticmethod
def execute_stealth_script(self):
    with open('stealth.min.js', 'r') as f:
        js = f.read()
        self.driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': js})
        print('###已执行stealth脚本###')

3. Cookie登录

为了方便快速登录,我们提供了通过Cookie进行登录的方法。初次运行代码时,用户登录后会在本地生成cookies.pkl文件来存储Cookie信息,用于快速登录。

def set_cookie(self):
    self.driver.get(damai_url)
    print("###请点击登录###")
    while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:
        sleep(1)
    print('###请扫码登录###')
    while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
        sleep(1)
    print("###扫码成功###")
    pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))
    print("###Cookie保存成功###")
    self.driver.get(target_url)

4. 打开浏览器与登录

打开浏览器,进入大麦网,并进行登录操作。

def enter_concert(self):
    print('###打开浏览器,进入大麦网###')
    self.driver.maximize_window()           # 最大化窗口
    self.login()                            # 先登录再说
    self.status = 2                         # 登录成功标识
    print("###登录成功###")

5. 选择票型

登录成功后,选择票型并进入购票流程。

def choose_ticket(self):
    if self.status == 2:                  #登录成功入口
        print("="*30)
        print("###检查是否开始售票###")
        self.driver.find_element(By.CLASS_NAME, 'buybtn').click()    #点击购票二维码下的购买连接
        time.sleep(1.5)
        self.check_order()

6. 确认订单

确认订单信息,准备进行支付。

def check_order(self):
    if self.status == 2:
        print('###开始确认订单###')
        if self.driver.title == '订单确认页':
            print('###检查是否需要填写观影人')
            self.driver.find_element(By.XPATH, '//*[@id="dmOrderSubmitBlock_DmOrderSubmitBlock"]/div[2]/div/div[2]/div[2]/div[2]/span').click()
            time.sleep(2)
            self.pay_order()

7. 支付宝支付

进行支付宝支付操作。

def pay_order(self):
    if self.driver.title == "支付宝付款":
        print('###支付订单###')
        time.sleep(60)
        self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div[1]/button[2]').click()
        print('###跳转至浏览器支付###')
        time.sleep(1.5)
        self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/div[1]/div[2]/input').clear()
        self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/div[1]/div[2]/input').send_keys('支付宝账号')      #输入支付宝账号
        self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/button').click()
        time.sleep(1.5)
        self.driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/button').click()
        while True:
            time.sleep(1)
            print('###请输入支付密码###')

结语

通过本文,你已经学会了如何使用Python和Selenium进行大麦网的自动化抢票。这不仅是一次编程实践,更是对网页自动化操作的深入理解。希望你能将所学应用到更多有趣和有益的项目中去。

效果展示

在这里插入图片描述

在这里插入图片描述


总结
本文介绍了如何使用Python和Selenium进行大麦网的自动化抢票。在数字化时代,抢票技术变得尤为重要,本文旨在通过编程实践,帮助读者掌握自动化抢票技巧。

首先,我们强调了遵守网站服务条款的重要性,并声明本教程仅供学习和研究使用。接着,介绍了环境准备,包括安装selenium库和下载对应浏览器的WebDriver。

文章详细解析了抢票过程中的关键步骤:定义抢票页面URL、执行stealth脚本以模拟正常用户行为、通过Cookie快速登录、打开浏览器并登录、选择票型、确认订单以及支付宝支付。这些步骤涵盖了从浏览器操作到网页元素定位的自动化操作。

通过本文,读者不仅学会了如何编写自动化抢票脚本,还深入理解了网页自动化操作的原理和实践。希望读者能将所学应用到更多有趣和有益的项目中去。最后,文章提供了完整的代码实现,供读者参考和实践。

总结来说,本文是一个关于如何利用现代编程技术解决实际问题的实用指南,旨在提高读者的编程技能,并鼓励合法合规地应用技术知识。通过自动化抢票的实战教程,我们展示了Python和Selenium的强大功能,以及在遵守法律法规的前提下,如何将这些技术应用于日常生活中的实际问题。

全部代码

import os
import time
import pickle
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

# 抢票相关页面
# 大麦网主页
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.home.card_0.ditem_1.2bbb23e1uo54LV&id=853329221023'

# 定义具体类
class Concert:
    def __init__(self):
        self.status = 0         # 状态,表示如今进行到何种程度
        self.login_method = 1   # {0:模拟登录,1:Cookie登录}自行选择登录方式
        self.driver = webdriver.Chrome()       # 默认Chrome浏览器
        self.execute_stealth_script(self)  # 执行stealth脚本

    # 执行stealth脚本
    # 机器检测问题,使用的driver会被识别为机器人,无法欺骗到检测程序,这里我们使用stealth.min.js进行解决。
    @staticmethod
    def execute_stealth_script(self):
        with open('stealth.min.js', 'r') as f:
            js = f.read()
            self.driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': js})
            print('###已执行stealth脚本###')

    # 通过cookie进行登陆
    # 在Concert类中login_method = 1时才会使用到,便于快速登陆,省去登陆过程,其中初次运行代码时,用户登陆后会在本地生成cookies.pkl文件来存储cookie信息,用于快速登陆。
    def set_cookie(self):
        self.driver.get(damai_url)
        print("###请点击登录###")
        while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:
            sleep(1)
        print('###请扫码登录###')

        while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
            sleep(1)
        print("###扫码成功###")
        pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))
        print("###Cookie保存成功###")
        self.driver.get(target_url)


    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)

    # 登陆
    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'):
                # 如果不存在cookie.pkl,就获取一下
                self.set_cookie()
            else:
                self.driver.get(target_url)
                self.get_cookie()

    # 打开浏览器
    def enter_concert(self):
        """打开浏览器"""
        print('###打开浏览器,进入大麦网###')
        self.driver.maximize_window()           # 最大化窗口
        # 调用登陆
        self.login()                            # 先登录再说
        # self.driver.refresh()                   # 刷新页面
        self.status = 2                         # 登录成功标识
        print("###登录成功###")


    # 选择票型
    def choose_ticket(self):
        if self.status == 2:                  #登录成功入口
            print("="*30)
            print("###检查是否开始售票###")
            # while not self.isElementExistByClass('buy-link'):
            #     self.driver.refresh()
            #     print("###售票尚未开始,刷新等待开始###")
            # TODO 选择票型
            #========begin=========
            # 选择具体票型部分未写,该部分可自行添加,不添加的话,自行选择进入页面后大麦的默认选择。
            #========end===========
            self.driver.find_element(By.CLASS_NAME, 'buybtn').click()    #点击购票二维码下的购买连接
            time.sleep(1.5)
            self.check_order()

    # 确认订单
    def check_order(self):
        if self.status == 2:
            print('###开始确认订单###')
            if self.driver.title == '订单确认页':
                print('###检查是否需要填写观影人')
                # if self.isElementExistByXPATH('//*[@id="dmViewerBlock_DmViewerBlock"]'):
                #     self.driver.find_element(By.XPATH, '//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div').click()
                #     time.sleep(0.5)
                # time.sleep(60)
                print('###跳转支付选择界面###')
                self.driver.find_element(By.XPATH, '//*[@id="dmOrderSubmitBlock_DmOrderSubmitBlock"]/div[2]/div/div[2]/div[2]/div[2]/span').click()
                time.sleep(2)
                self.pay_order()

    # 支付宝登陆支付
    def pay_order(self):
        if self.driver.title == "支付宝付款":
            print('###支付订单###')
            time.sleep(60)
            self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div[1]/button[2]').click()
            print('###跳转至浏览器支付###')
            time.sleep(1.5)
            self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/div[1]/div[2]/input').clear()
            self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/div[1]/div[2]/input').send_keys('支付宝账号')      #输入支付宝账号
            self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/button').click()
            time.sleep(1.5)
            self.driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/button').click()
            while True:
                time.sleep(1)
                print('###请输入支付密码###')

    # 脚本结束退出
    def finish(self):
        self.driver.quit()

if __name__ == '__main__':
    try:
        con = Concert()  # 初始化函数
        con.enter_concert()  # 打开浏览器
        con.choose_ticket()  # 开始抢票

    except Exception as e:
        print(e)
        con.finish()


http://www.kler.cn/a/451410.html

相关文章:

  • C++ 指针进阶:动态内存与复杂应用
  • AIDD - 探索语言模型在药物分子生成方面的应用
  • 数据结构与算法学习笔记----质数
  • 取多个集合的交集
  • 智能体实战(需求分析助手)一、需求概述及迭代规划
  • ctfshow web入门文件上传总结
  • Qt笔记:文件I/O操作
  • Android studio开启虚拟机闪退、闪屏、死机、电脑重启
  • Web Server for Chrome 使用教程
  • 虚幻引擎结构之AActor
  • 电子应用设计方案70:智能挂钟系统设计
  • C语言——数据在内存中的存储
  • Django REST framework (DRF)中的api_view和APIView权限控制
  • 如何设置爬虫的访问频率?
  • 物理层知识要点
  • Oracle 数据库锁与阻塞分析与解决指南
  • 优化程序中的数据:从代数到向量解
  • 2024最新鸿蒙开发面试题合集-HarmonyOS NEXT Release(API 12 Release)
  • 【unity c#】深入理解string,以及不同方式构造类与反射的性能测试(基于BenchmarkDotNet)
  • 一款基于.NET开发的AI无损放大工具
  • vue3 的ref和reactive的区别?
  • 3D造型软件solvespace在windows下的编译
  • elasticsearch 数据库查询很慢如何优化
  • Stable-diffusion-WebUI 的API调用(内含文生图和图生图实例)
  • DocFlow票据AI自动化处理工具,提升企业票据数字化管理效能
  • mybatis框架——缓存,分页