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

举报
HUAWEIXIAZHI 发表于 2024/11/22 14:38:01 2024/11/22
【摘要】 抢票神器:大麦网抢票实战教程前提声明本教程旨在教授如何使用Python和Selenium进行网页自动化操作,不鼓励任何违反网站服务条款的行为。本代码仅供学习和研究使用,不得用于商业用途。请确保在合法合规的前提下使用本代码。本代码所涉及的操作均为模拟正常用户行为,不涉及任何非法入侵或数据窃取。目录引言环境准备代码结果代码解析1. 抢票页面与登录2. 执行stealth脚本3. Cookie登录...

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

前提声明

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

目录

  1. 引言
  2. 环境准备
  3. 代码结果
  4. 代码解析
  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()

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。