当前位置:   article > 正文

【都2024了,演唱会门票还抢不到?!不要慌,教你用python实现自动化抢票,快来学学吧!!!】_演唱会抢票代码

演唱会抢票代码
关注我,每天学习Python新技能

之前有小伙伴留言说女朋友快生日了,喜欢某某某但是手动买票根本就是买不到,又不想当大冤种从黄牛手里加钱,于是乎在疯狂星期四的晚上遭到’‘贿赂’'的我连夜搞定了

在数字化时代,抢票成为许多人面临的一大挑战。无论是演唱会门票、火车票还是其他热门活动的入场券,一旦错过就可能遗憾终生。因此,利用Python自动化抢票成为了许多人的选择。

Python作为一门强大的编程语言,其简洁易懂的语法和丰富的库资源为自动化抢票提供了可能。通过编写Python脚本,我们可以模拟人工操作,自动登录、查询、选择和购买票务,大大提高了抢票的成功率。

在编写自动化抢票脚本时,我们需要注意以下几点。首先,要确保脚本的稳定性和可靠性,避免在关键时刻出现错误。其次,要考虑到网络延迟和服务器负载等因素,合理设置请求间隔和重试机制。此外,我们还需要遵守相关的法律法规和平台规定,不得使用非法手段进行抢票。

自动化抢票不仅可以帮助我们节省时间和精力,还可以让我们在第一时间获取心仪的票务资源。然而,我们也要意识到,抢票并非万能,有时候还需要结合其他策略和方法来提高成功率。例如,提前了解活动信息、关注官方渠道、加入抢票群等都是不错的选择。

一丶安装环境和配置文件

要用python实现,下载和安装python自然是不用说了,还有pycharm,不会下载安装python和pycharm的可以参考之前的文章或者视频(省去一万字)

selenium库的安装

python自动化的实现离不开selenium库,想要实现自动化抢票/抢茅台/九价资格等等都需要安装selenium,要使用Python和Selenium进行自动化购票,需要完成以下步骤:

1.安装Python和pip

首先,需要安装Python解释器和pip包管理器。你可以在Python的官方网站上下载并安装Python:https://www.python.org/downloads/。一般来说,Python3.x是最新的版本,推荐使用Python3。

2. 安装Selenium库

一旦你安装了Python和pip,你可以使用以下命令来安装Selenium库:

pie install selenium

  • 1
  • 2
3. 下载浏览器驱动

Selenium需要相关的浏览器驱动程序来与浏览器进行交互。你需要下载并安装适用于你所使用的浏览器和操作系统的驱动。下面是各个浏览器对应的驱动下载链接:

  • 「Chrome」:http://chromedriver.chromium.org/downloads

下载后,将驱动程序解压并将可执行文件所在的路径添加到系统的环境变量中。因为我用的是谷歌的所以这么推荐。

4. 编写Python脚本:

使用Python的编辑器创建一个新的.py文件,并使用以下代码片段作为开始,以下是我本次抢票的源码,以大麦网参考。

二丶源码实现

如图所示。程序运行玩提示:「抢票完成」,但是目前只适用于网页版,所以部分得不行,适用APP版等我回头研究好了,在重新说明。「还有一定要注意你的网速哦」

源码如下:
import os  # 创建文件夹, 文件是否存在  
import time  # time 计时  
import pickle  # 保存和读取cookie实现免登陆的一个工具  
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_2.591b23e1AyXdAl&id=729700971838'  
  
  
# class Concert:  
class Concert:  
    # 初始化加载  
    def __init__(self):  
        self.status = 0  # 状态, 表示当前操作执行到了哪个步骤  
        self.login_method = 1  # {0:模拟登录, 1:cookie登录}自行选择登录的方式  
        self.driver = webdriver.Chrome(executable_path='chromedriver.exe')  # 当前浏览器驱动对象  
  
    # cookies: 登录网站时出现的 记录用户信息用的  
    def set_cookies(self):  
        """cookies: 登录网站时出现的 记录用户信息用的"""  
        self.driver.get(damai_url)  
        print('###请点击登录###')  
        # 我没有点击登录,就会一直延时在首页, 不会进行跳转  
        while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:  
            sleep(1)  
        print('###请扫码登录###')  
        # 没有登录成功  
        while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':  
            sleep(1)  
        print('###扫码成功###')  
        # get_cookies: driver里面的方法  
        pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))  
        print('###cookie保存成功###')  
        self.driver.get(target_url)  
  
    # 假如说我现在本地有 cookies.pkl 那么 直接获取  
    def get_cookie(self):  
        """假如说我现在本地有 cookies.pkl 那么 直接获取"""  
        cookies = pickle.load(open('cookies.pkl', 'rb'))  
        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###')  
  
    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'):  
                self.set_cookies()  # 没有文件的情况下, 登录一下  
            else:  
                self.driver.get(target_url)  # 跳转到抢票页  
                self.get_cookie()  # 并且登录  
  
    def enter_concert(self):  
        """打开浏览器"""  
        print('###打开浏览器,进入大麦网###')  
        # 调用登录  
        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 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)  # 刷新页面 继续执行操作  
                    elif buybutton == '立即预定':  
                        # 点击立即预定  
                        self.driver.find_element('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('正在加载.......')  
                        # 如果当前购票人信息存在 就点击  
                        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'):  
                print('请快速选择你想要的座位!!!')  
            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('###开始确认订单###')  
            time.sleep(1)  
            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, '//*[@id="container"]/div/div[9]/button').click()  
            time.sleep(20)  
  
    def isElementExist(self, element):  
        """判断元素是否存在"""  
        flag = True  
        browser = self.driver  
        try:  
            browser.find_element(By.XPATH, element)  
            return flag  
        except:  
            flag = False  
            return flag  
  
    def finish(self):  
        """抢票完成, 退出"""  
        self.driver.quit()  
  
  
if __name__ == '__main__':  
    con = Concert()  
    try:  
        con.enter_concert()  # 打开浏览器  
        con.choose_ticket()  # 选择座位  
    except Exception as e:  
        print(e)  
        con.finish()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171

需要注意的是,不同的购票网站可能会有不同的网页结构和交互方式。你可能需要使用Selenium提供的API来定位元素和模拟用户操作

此外,Selenium还支持Headless模式,可以在后台运行浏览器以节省资源和提高效率。可以通过设置浏览器选项来启用Headless模式。

有详细的配套教程以及源码,都已经打包好上传到百度云了,链接在文章结尾处!
需要可以微信扫描下方CSDN官方认证二维码免费领取

最后我自己整理了一些学习资料,希望对你们有帮助。

Python学习大纲
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述
入门学习视频
在这里插入图片描述
Python实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述
在这里插入图片描述

总之,Python自动化抢票为我们提供了一种便捷、高效的抢票方式。只要我们合理利用这一工具,并结合其他策略和方法,相信我们一定能够成功抢到心仪的票务资源。

关注我,每天学习Python新技能

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/721309
推荐阅读
相关标签
  

闽ICP备14008679号