教你用Python来制作一个自动抢票的脚本小程序

 更新时间:2023年07月30日 16:59:21   作者:魔王不会哭  
大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域,但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票,那么,今天带大家用Python来制作一个自动抢票的脚本小程序,需要的朋友可以参考下

此次知识点:

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

开发环境:

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

python安装包 安装教程视频

pycharm 社区版 专业版 及 激活码

视频教程

第三方库:

  • selenium >>> pip install selenium==3.4.1

步骤

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

  • 抢票并且下单

首先导入本次所需的模块

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这条路上依心而行,别回头,别四顾。一如既往不改初见的模样,未来的路很长,不管怎样,一定要相信自己一直走下去。

以上就是教你用Python来制作一个自动抢票的脚本小程序的详细内容,更多关于Python自动抢票脚本的资料请关注脚本之家其它相关文章!

相关文章

  • Django Haystack 全文检索与关键词高亮的实现

    Django Haystack 全文检索与关键词高亮的实现

    这篇文章主要介绍了Django Haystack 全文检索与关键词高亮的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Python使用argcomplete模块实现自动补全

    Python使用argcomplete模块实现自动补全

    argcomplete 是一个强大的Python库,可以大幅改善命令行应用程序的用户体验,本文主要介绍了argcomplete模块的相关用法,感兴趣的小伙伴可以了解下
    2023-11-11
  • Python枚举之Enum模块的原理与应用详解

    Python枚举之Enum模块的原理与应用详解

    前段时间在阅读别人的代码时,看到代码中有好多数字,虽然增加的注释,哪个值代表哪种状态,但还是看起来很难受,不优雅,如何改善这个问题呢?当然是枚举,本文将深入探讨Python枚举中的Enum模块,需要的朋友可以参考下
    2023-11-11
  • 一文带你解密Python可迭代对象的排序问题

    一文带你解密Python可迭代对象的排序问题

    这篇文章主要为大家详细介绍一下Python中可迭代对象的排序问题,文中的示例代码讲解详细,对我们深入了解Python有一定帮助,感兴趣的可以了解一下
    2022-07-07
  • python dict 相同key 合并value的实例

    python dict 相同key 合并value的实例

    今天小编就为大家分享一篇python dict 相同key 合并value的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python flask框架post接口调用示例

    Python flask框架post接口调用示例

    这篇文章主要介绍了Python flask框架post接口调用,结合实例形式分析了基于flask框架的post、get请求响应及接口调用相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • python获取word文档总页数的两种方法

    python获取word文档总页数的两种方法

    这篇文章主要介绍了python获取word文档的总页数的两种方法,文中给出了两种解决方案,两种方案也都各有优缺点,可能也不一定是完全准确的,需要的朋友可以参考下
    2024-03-03
  • python中Task封装协程的知识点总结

    python中Task封装协程的知识点总结

    在本篇内容里小编给大家总结的是一篇关于python中Task封装协程的知识点总结内容,有兴趣的朋友们可以跟着学习下。
    2021-07-07
  • python tkinter之 复选、文本、下拉的实现

    python tkinter之 复选、文本、下拉的实现

    这篇文章主要介绍了python tkinter之 复选、文本、下拉的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 利用Python实现RSA加密解密方法实例

    利用Python实现RSA加密解密方法实例

    过去几天我一直在尝试用Python实现RSA算法,下面这篇文章主要给大家介绍了关于利用Python实现RSA加密解密的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论