想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本

2023-05-16

前言

嗨喽!大家好,这里是魔王!!

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

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

那么,今天带大家用Python来制作一个自动抢票的脚本小程序
请添加图片描述

此次知识点:

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

开发环境:

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

python安装包 安装教程视频

pycharm 社区版 专业版 及 激活码

视频教程私我领取

第三方库:

  • selenium >>> pip install selenium==3.4.1

步骤

  1. 实现免登陆
    第一次登陆的时候 会帮助我记录我们的登陆信息
    set_cookie 登陆成功之后 cookie会发生变化
    后续抢票: 直接使用我们记录好的登陆信息
    get_cookie

  2. 抢票并且下单

请添加图片描述

首先导入本次所需的模块

from selenium import webdriver  # 操作谷歌浏览器 需要额外安装的 并且现在安装这个模块得指定版本 3.4
from time import sleep
import pickle  # 保存和读取cookie实现免登录的工具
import os   # 操作文件的模块

第一步,实现免登录

确定目标,设置全局变量

# 大麦网主页
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):
![请添加图片描述](https://img-blog.csdnimg.cn/4a0b661782e24b8ebf46390fb2333452.gif)
    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()

效果

请添加图片描述
好了,我的这篇文章写到这里就结束啦!

希望你在python这条路上依心而行,别回头,别四顾。一如既往不改初见的模样,未来的路很长,不管怎样,一定要相信自己一直走下去。

有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!
请添加图片描述

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

想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本 的相关文章

  • 【Pytorch】加载torchvision中预训练好的模型并修改默认下载路径(使用models.__dict__[model_name]()读取)

    说明 使用torchvision model加载预训练好的模型时 xff0c 发现默认下载路径在系统盘下面的用户目录下 xff08 这个你执行的时候就会发现 xff09 xff0c 即C 用户名 cache torch checkpoint
  • 【Pytorch】tensor索引另一个tensor(tensor[tensor])

    说明 最近在使用pytorch中tensor的时候 xff0c 遇到了需要使用tensor1 tensor2 的情况 xff0c 发现了这篇博客 xff0c 他从代码的角度解释了其工作原理 xff0c 这里我用图示的方式解释tensor类型
  • 【deepstream】deepstream调用opencv(c与c++联合编译)

    目的 在deepstream项目中调用opencv库 xff0c 丰富deepstream功能 xff08 如往deepstream加入kalman filter实现跟踪 xff09 操作环境 Ubuntu 18 04Qt Creatot
  • pycharm不能导入不同文件夹下的自定义模块

    文件目录结构如下所示 xff1a span class token operator span A1 span class token operator span span class token operator span B1 span
  • 【力扣】654. 最大二叉树

    题目概述 原题链接 相关节点定义 xff1a span class token comment Definition for a binary tree node struct TreeNode int val TreeNode left
  • 【力扣】114. 二叉树展开为链表

    题目概述 原题链接 树定义如下 xff1a span class token comment Definition for a binary tree node struct TreeNode int val TreeNode left T
  • 【力扣】725. 分隔链表

    题目概述 原题链接 链表定义如下 xff1a span class token comment Definition for singly linked list struct ListNode int val ListNode next
  • Angular应用开发中遇到的问题

    记录在开发Angular应用时遇到的问题以及解决方案 问题 3 前提 xff1a 在Angular应用的组件中使用响应式表单进行数据校验 xff0c 使用FormBuilder服务的 group 方法来构建一组FormControl实例 需
  • 浏览器插件解决跨域问题

    浏览器插件解决跨域问题 在前端进行调试时 xff0c 经常会遇到CORS问题 xff0c 在调试时 xff0c 可暂时使用浏览器插件解决跨域问题 浏览器 xff1a Microsoft Edge 插件搜索截图如下 xff1a 插件开启后 x
  • 洛谷P1591 阶乘数码(C语言)简单易懂

    题目描述 求 n n 中某个数码出现的次数 输入格式 第一行为 t t leq 10 t t 10 xff0c 表示数据组数 接下来 t 行 xff0c 每行一个正整数 n n leq 1000 n n 1000 和数码 aa 输出格式 对
  • 将java项目发布到maven中央仓库(踩坑大全)

    前言 xff1a 第一次将构件发布到中央仓库 xff0c 真的不是一件轻松的事情 xff0c 网络上有很多其他文章大都不会把坑帮你描述清楚 所以觉得非常有必要把些步骤记下来 xff0c 让大家少走点弯路 一 maven中央仓库简介 相关内容
  • IOS-----手动创建Main界面

    1 删除info plist中的Main设置 2 创建MainViewController h 和MainViewController m xff08 1 xff09 布局界面 xff1a UIViewController instance
  • 【转载+修改】通过ssh 转发 X 图形界面

    转载自 xff1a http linux chinaitlab com administer 742586 html 过程精简如下 xff1a 1 配置你要链接到的机器的sshd 在 etc ssh sshd config 中将 Allow
  • [已解决]IDEA各文件类变成灰色的处理方法

    这是我遇到的问题 xff0c 创建好一个工程后 xff0c 各文件类变成了灰色 大概总结网上所说的的原因和处理方法 xff0c 可能是由于pom xml没有成功被解析 解决方法一 xff1a 右键点击这个pom文件 xff0c 选择将其添加
  • ubuntu安装opencv的正确方法

    本文介绍的是如何安装ubuntu下C 43 43 接口的opencv 1 安装准备 xff1a 1 1安装cmake sudo apt get install cmake 1 2依赖环境 sudo apt get install build
  • Ubuntu16.04升级 Ubuntu18.04

    Ubuntu16 04升级 Ubuntu18 04 1 更新资源 sudo apt get update sudo apt get upgrade sudo apt dist upgrade 2 安装update manager core
  • C++那些细节--typedef关键字

    一 简介 关于typedef关键字 xff0c 以前刚刚学C语言的时候 xff0c 用它来重定义结构体别名 之后的话就是在用函数指针的时候用过一些 xff0c 然而并不知道这个还有什么用处 今天花点时间总结一下typedef的细节 在计算机
  • python图片识别之tesseract

    经过两个下午的尝试 xff0c 终于搞出来了 xff1b 特记录下来备忘 xff1b 首先来看python代码识别图片 xff0c 这一段较为简单 xff1b span class token keyword from span PIL s
  • 游戏设计流失点总结

    xff08 1 xff09 直接彻底玩不懂 比如我之前的很多游戏 xff0c 玩家不知道怎么玩的挫败感会直接让ta去寻找更容易理解游戏 xff08 2 xff09 文字量太大 xff0c 懒得去学 有些游戏虽然有教程 xff0c 但是是长达
  • Rust安装(windows)

    windows安装Rust开发环境指南 Rust的安装非常简单 xff0c 官网下载安装包双击就能安装 xff0c 但是在windows上使用总是能遇到一些问题 xff0c 今天我们就来踩踩坑 设置安装路径 当你安装Rust的时候会发现没法

随机推荐