前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python制作【大麦网】抢票程序,看演唱会再也不怕没票了

Python制作【大麦网】抢票程序,看演唱会再也不怕没票了

作者头像
松鼠爱吃饼干
发布于 2021-09-24 02:39:37
发布于 2021-09-24 02:39:37
12.1K00
代码可运行
举报
文章被收录于专栏:Python分享Python分享
运行总次数:0
代码可运行

前言

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

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

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

知识点:

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

开发环境:

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

先导入本次所需的模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import time
import pickle
from time import sleep
from selenium import webdriver

第一步,实现免登录

确定目标,设置全局变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 大麦网主页
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

初始化加载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

登录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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()

打开浏览器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

第二步,抢票并下单

判断元素是否存在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def isElementExist(self, element):
    flag = True
    browser = self.driver
    try:
        browser.find_element_by_xpath(element)
        return flag

    except:
        flag = False
        return flag

选票操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

选择座位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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()

下单操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

抢票完成,退出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def finish(self):
    self.driver.quit()

测试代码是否成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == '__main__':
    try:
        con = Concert()             # 具体如果填写请查看类中的初始化函数
        con.enter_concert()         # 打开浏览器
        con.choose_ticket()         # 开始抢票

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

最后看下效果如何

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 松鼠爱吃饼干 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高并发风控技术解密(下)
  •从业务中抽象及通用——如果一种业务有可能在今后重复出现,那就将其模块化,系统化(如批处理系统),发展成为平台能力
美的让人心动
2018/05/25
7070
后端思想篇:设计好接口的36个锦囊!
大家好,我是捡田螺的小男孩。作为后端开发,不管是什么语言,Java、Go还是C++,其背后的后端思想都是类似的。后面打算出一个后端思想的技术专栏,主要包括后端的一些设计、或者后端规范相关的,希望对大家日常工作有帮助哈。
捡田螺的小男孩
2022/05/23
8360
后端思想篇:设计好接口的36个锦囊!
理解进程调度的基本过程,为学好多线程打好基础
操作系统是一组专门做计算机资源管理的软件的统称。目前常见的操作系统有:Windows,Unix,Linux,OSX,Android,ios等。
终有救赎
2023/10/16
2960
理解进程调度的基本过程,为学好多线程打好基础
设计数据密集型应用(10-11):大数据的批处理和流处理
谈大数据批处理,绕不过的就是 MapReduce。MapReduce 是大数据处理的老祖宗了。
linjinhe
2020/04/01
6260
设计数据密集型应用(10-11):大数据的批处理和流处理
大神分享美团外卖订单中心演进之路
作者:何轼 来源: http://tech.meituan.com/mt_waimai_order_evolution.html 前言 美团外卖从2013年9月成交首单以来,已走过了三个年头。时期,事
小小科
2018/05/04
2.9K1
大神分享美团外卖订单中心演进之路
操作系统的演变及在云计算的应用
随着现代信息越来越丰富,更多的信息需要被处理及计算,仅仅的单台计算机已经满足不了计算,需要将更多的计算机进行同时计算,对操作系统的要求则越来越高,各种各样云计算的的操作系统也应运而生。
jackwlchen
2020/08/10
1.4K0
操作系统的演变及在云计算的应用
有赞客户运营系统的演进
有赞,是一个商家服务公司。我们帮助每一位重视产品和服务的商家私有化顾客资产、拓展互联网客群、提高经营效率,全面助力商家成功。而拉新、留存、促活、转化则是商家经营的关键指标。随着线上线下流量越来越贵,商家对客户精准运营诉求越来越强烈。有赞客户运营相关的业务产品也在近一年不断推陈出新。
有赞coder
2020/08/25
1.2K0
有赞客户运营系统的演进
Kubernetes上的高性能计算 (HPC)
机器学习 (ML) 工程在过去几年已演变为一门学科和职业道路。软件工程师构建 Web、移动和嵌入式体验,而 ML 工程师提供模型版本、推理和整个 RAG 应用程序。
云云众生s
2024/04/11
4120
美团外卖订单中心的演进 转
美团外卖从2013年9月成交第一单以来,已走过了三个年头。期间,业务飞速发展,美团外卖由日均几单发展为日均500万单(9月11日已突破600万)的大型O2O互联网外卖服务平台。平台支持的品类也由最初外卖单品拓展为全品类。
chinotan
2019/04/03
1.1K0
操作系统发展历史
计算机的发展经历了4个阶段,电子管计算机(1945-1955)、晶体管计算机(1955-1965)、集成电路计算机(1965-1980)、大规模集成电路计算机(1980-至今)。因此,伴随着计算机硬件的更新换代,操作系统也经历了4个阶段,分别是手工操作(50年代早期)、单道批处理系统(50年代)、多道批处理系统(60年代初)、分时系统(60年代中)。
xujjj
2019/06/29
3.3K0
操作系统发展历史
【文章笔记】性能优化技巧参考
原文如下:https://mp.weixin.qq.com/s/yXVkHSRdwjXFM7Xv03x3-Q
阿东
2022/12/21
4910
【文章笔记】性能优化技巧参考
百亿规模API网关服务Shepherd的设计与实现
在微服务架构下,服务拆分会让API的规模成倍增长,使用API网关来管理API逐渐成为一种趋势。美团统一API网关服务Shepherd就是在这种背景下应运而生,适用于美团业务且完全自研,用于替换传统的Web层网关应用,业务研发人员通过配置的方式即可对外开放功能和数据。本文将介绍美团统一API网关诞生的背景、关键的技术设计和实现,以及API网关未来的规划,希望能给大家带来一些帮助或者启发。
美团技术团队
2021/05/31
1.9K0
百亿规模API网关服务Shepherd的设计与实现
13 . Python3之并发编程
现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。
iginkgo18
2020/09/27
1K0
13 . Python3之并发编程
.NET面试题系列[16] - 多线程概念(1)
这篇文章主要是各个百科中的一些摘抄,简述了进程和线程的来源,为什么出现了进程和线程。
s055523
2018/09/14
9050
微博视频处理系统的云原生之路
大家好,我是来自微博视频平台的黄阳全,今天分享的主题是微博视频处理系统云原生之路。
LiveVideoStack
2022/02/11
1.4K0
微博视频处理系统的云原生之路
亿级流量网站架构核心技术【笔记】(二)
九、应用级缓存 A.缓存简介 1.先从缓存中读取数据,如果没有,再从慢速设备上读取实际数据并同步到缓存 2.经常读取的数据、频繁访问的数据、热点数据、I/O瓶颈数据、计算昂贵的数据、符合5分钟法则和局部性原理的数据都可以缓存 B.缓存命中率 1.缓存命中率=从缓存中读取次数/【总读取次数(从缓存中读取次数+从慢速设备上读取次数)】 C.缓存回收策略 1.基于空间,指缓存设置了存储空间 2.基于容量,指缓存设置了最大大小 3.基于时间
硬核项目经理
2019/08/06
1.3K0
亿级流量网站架构核心技术【笔记】(二)
漫谈进程和线程
我们知道文件是对I/O设备的抽象,虚拟存储器是对文件和主存的抽象,指令集是对CPU的抽象,进程是对指令集和虚拟存储器的抽象。如下图所示 。
木可大大
2018/04/02
2.1K6
漫谈进程和线程
【进击面试_02】Java 多线程
进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
Demo_Null
2021/03/04
3680
【进击面试_02】Java 多线程
多线程基础
<font color="red">中央处理器</font>: 作为计算机系统的运算和控制的核心,是信息处理、程序运行的最终执行单元。
程序员NEO
2023/09/30
2500
多线程基础
基于Hadoop的统一数据服务层演进与Hudi技术的前世今生
随着Apache Parquet和Apache ORC等存储格式以及Presto和Apache Impala等查询引擎的发展,Hadoop生态系统有潜力成为容忍几分钟延迟的通用统一服务层。然而,这需要Hadoop分布式文件系统(HDFS)实现高效低延迟的数据摄入和准备。
用户9421738
2025/03/28
770
基于Hadoop的统一数据服务层演进与Hudi技术的前世今生
相关推荐
高并发风控技术解密(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验