Python制作【大麦网】自动抢票程序

2023-11-13

Python制作【大麦网】自动抢票程序

前言

大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。

但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票

那么,今天带大家用Python来制作一个自动抢票的脚本小程序

知识点:

  • 面向对象编程
  • selenium 操作浏览器
  • pickle 保存和读取Cookie实现免登陆
  • time 做延时操作
  • os 创建文件,判断文件是否存在

开发环境:

  • 版 本:anaconda5.2.0(python3.6.5)
  • 编辑器:pycharm

【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学

先导入本次所需的模块

import os
import time
import pickle
from time import sleep
from selenium import webdriver

第一步,实现免登录

确定目标,设置全局变量

# 大麦网主页
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.search_category.0.0.77f24d15RWgT4o&id=654534889506&clicktitle=%E5%A4%A7%E4%BC%97%E7

初始化加载

class Concert:
    def __init__(self):
        self.status = 0         # 状态,表示如今进行到何种程度
        self.login_method = 1   # {0:模拟登录,1:Cookie登录}自行选择登录方式
        self.driver = webdriver.Chrome(executable_path='chromedriver.exe')        # 默认Chrome浏览器

登录调用设置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)

获取cookie

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("###登录成功###")
    # 后续德云社可以讲
    if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):
        self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()

第二步,抢票并下单

判断元素是否存在

def isElementExist(self, element):
    flag = True
    browser = self.driver
    try:
        browser.find_element_by_xpath(element)
        return flag

    except:
        flag = False
        return flag

选票操作

def choose_ticket(self):
    if self.status == 2:                  #登录成功入口
        print("="*30)
        print("###开始进行日期及票价选择###")
        while self.driver.title.find('确认订单') == -1:           # 如果跳转到了订单结算界面就算这步成功了,否则继续执行此步
            try:
                buybutton = self.driver.find_element_by_class_name('buybtn').text
                if buybutton == "提交缺货登记":
                    # 改变现有状态
                    self.status=2
                    self.driver.get(target_url)
                    print('###抢票未开始,刷新等待开始###')
                    continue
                elif buybutton == "立即预定":
                    self.driver.find_element_by_class_name('buybtn').click()
                    # 改变现有状态
                    self.status = 3
                elif buybutton == "立即购买":
                    self.driver.find_element_by_class_name('buybtn').click()
                    # 改变现有状态
                    self.status = 4
                # 选座购买暂时无法完成自动化
                elif buybutton == "选座购买":
                    self.driver.find_element_by_class_name('buybtn').click()
                    self.status = 5
            except:
                print('###未跳转到订单结算界面###')
            title = self.driver.title
            if title == '选座购买':
                # 实现选座位购买的逻辑
                self.choice_seats()
            elif title == '确认订单':
                while True:
                    # 如果标题为确认订单
                    print('waiting ......')
                    if self.isElementExist('//*[@id="container"]/div/div[9]/button'):
                        self.check_order()
                        break

选择座位

    def choice_seats(self):
        while self.driver.title == '选座购买':
            while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):
                # 座位手动选择 选中座位之后//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img 就会消失
                print('请快速的选择您的座位!!!')
            # 消失之后就会出现 //*[@id="app"]/div[2]/div[2]/div[2]/div
            while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):
                # 找到之后进行点击确认选座
                self.driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/button').click()

下单操作

def check_order(self):
    if self.status in [3,4,5]:
        print('###开始确认订单###')
        try:
            # 默认选第一个购票人信息
            self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
        except Exception as e:
            print("###购票人信息选中失败,自行查看元素位置###")
            print(e)
        # 最后一步提交订单
        time.sleep(0.5)  # 太快会影响加载,导致按钮点击无效
        self.driver.find_element_by_xpath('//div[@class = "w1200"]//div[2]//div//div[9]//button[1]').click()

抢票完成,退出

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

最后看下效果如何

对于本篇文章有疑问的同学也可以点这里

www.ijzcn.cn
www.awaedu.com
www.zuowenge.cn

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python制作【大麦网】自动抢票程序 的相关文章

随机推荐

  • Python 学习笔记

    1 函数 2 其他 未完待续 1 函数 append 在列表末尾添加一个元素 list append item count 计算指定元素在列表 字符串或元组中出现的次数 for i in uniqueArr nums append arr
  • Weblogic远程代码执行漏洞 CVE-2023-21839

    漏洞简介 WebLogic Core远程代码执行漏洞 CVE 2023 21839 该漏洞允许未经身份验证的远程攻击者通过T3 IIOP协议进行 JNDI lookup 操作 破坏易受攻击的WebLogic服务器 成功利用此漏洞可能导致Or
  • C语言实验(十四):指针(数组排序,数组求平均数、中位数和众数)

    C语言实验 十四 指针 数组排序 数组求平均数 中位数和众数 一 输入10个整数 利用指针分别由小到大排序 由大到小排序 二 输入10个整数 通过指针引用数组 实现三个函数 分别求这10个整数的平均值 中位数 中值 数组名作为函数参数 通过
  • 人机融合的经验与人类的或机器的经验不同

    一 人机融合的经验与人 机器的经验有所不同 人的经验是通过感知 学习思考等方式积累起来的 是基于我们的感官 情感和意识等特点所形成的 人在与世界交互的过程中 通过观察事物 从错误中学习 与他人交流等方式逐渐积累了大量的经验 人类的经验通常包
  • Ubuntu16.04搭建FTP服务器

    1 vsftpd sudo apt get update sudo apt get install vsftpd 2 检查是否安装成功 vsftpd version 二 修改配置文件 1 修改vsftpd conf文件内容 sudo vim
  • ASCII码详解

    ASCII码表 ASCII码大致可以分作三部分組成 第一部分是 ASCII非打印控制字符 第二部分是 ASCII打印字符 第三部分是 扩展ASCII打印字符 第一部分 ASCII非打印控制字符表 ASCII表上的数字0 31分配给了控制字符
  • 切面更改入参

    定义一个注解 package com huaxia bigdata bi common annotation import com zeekr bigdata bi common constant Constant import com z
  • oracle 9i英文版下载,oracle9i各种版本的下载地址

    Oracle9i Database Release 2 Enterprise Standard Personal Edition for Windows NT 2000 XP http download oracle com otn nt
  • vue3切换路由模式——Hash 、histoary

    1 history模式 使用createWebHistory import createRouter createWebHistory from vue router import Home from views Home vue cons
  • ajax进度条视频缩略图,ajax 异步上传带进度条视频并提取缩略图.pdf

    ajax 异异步步上上传传带带进进度度条条视视频频并并提提取取缩缩略略图图 这篇文章主要介绍了ajax 异步上传带进度条视频并提取缩略图的相关资料 需要的朋友可以参考下 最近在 一个集富媒体功能于一身的项目 需要上传视频 这里我希望 成异步
  • 【Javascript】栈和队列的实现

    Js实现栈和队列 前言 leetcode 232 用栈实现队列 leetcode 225 用队列实现栈 前言 我们知道栈的原理是先进后出 队列的原理是先进先出 在JS中主要通过数组来实现队列和数组的功能 首先我们来看栈 入栈可以用 arr
  • jeecgboot后端java及前端vue无参数获取当前登录用户名等信息

    后端在controller中 注意 必须为带请求的接口 定时任务无法获得此信息 LoginUser loginUser LoginUser SecurityUtils getSubject getPrincipal String userI
  • uni-app搭建Android APP调试环境及兼容处理

    uni app搭建Android APP调试环境及兼容处理 1 回顾 2 利用MUMU模拟器搭建手机模拟器 3 uni API兼容处理方法 参考文献 1 回顾 之前 我在uni app环境搭建的文章中简单写了一下怎么搭建uni app环境并
  • java filereader 用法_第2章 FileReader类使用

    1 1 FileReader读数据一次读取一个字符 1 1 1 案例代码五 package com itheima 02 import java io FileReader import java io IOException 需求 从文件
  • 西瓜书学习笔记第1章(绪论)机器学习

    西瓜书学习笔记第1章 绪论 机器学习 1 1引言 1 2基本术语 1 3假设空间 1 4归纳偏好 1 5发展历程 1 6应用现状 1 1引言 机器学习是这样一门学科 它致力于研究如何通过计算的手段 利用经验来改善系统自身的性能 经验的存在形
  • 为什么RPA机器人会广泛应用于财务管理领域?

    RPA不是一个物理机器人 而是软件机器人 它的优点在于 可以根据规则自动执行任务 并减轻团队执行手动流程的负担 RPA适用于手动的 重复的 错误率高的流程 RPA机器人主要做三件事 降低成本 提高质量 改进操作控制 财务流程充满了搜索 传输
  • 做一个缓存,记录是否进入过此页面

    GuideActivity 如果不是第一次进入主页面 应做一个缓存 记录一下 如果进入过主页面 则下次不经过引导页面直接进入主页面 如果没有进入过主页面 则按正常情况下 先进入引导页面 再进入主页面 CacheUitls putBoolea
  • hadoop和hive、spark、presto、tez是什么关系

    Hadoop是一个分布式计算框架 可以在大数据集上运行分布式应用程序 它由许多组件组成 包括HDFS 分布式文件系统 和MapReduce 分布式计算引擎 Hive是一个基于Hadoop的数据仓库系统 它允许用户使用SQL语言来查询和分析大
  • 【红外DDE算法】HE算法在红外图像可视化上的应用(附源码)

    直方图均衡 HE 在红外图像可视化上的应用 附源码 1 背景需求 制冷型红外相机模拟前端使用较高数据位数进行采样 一般常用 14位 16 位 但是人眼对于灰度的感知 最多能感知 128 个灰阶 并且数据一般是以 8 的整数倍的位宽在电子系统
  • Python制作【大麦网】自动抢票程序

    Python制作 大麦网 自动抢票程序 前言 大麦网 是中国综合类现场娱乐票务营销平台 业务覆盖演唱会 话剧 音乐剧 体育赛事等领域 但是因为票数有限 还有黄牛们不能丢了饭碗 所以导致了 很多人都抢不到票 那么 今天带大家用Python来制