都2024了,演唱会门票还抢不到?!不要慌,教你用python实现自动化抢票

[复制链接]
发表于 2026-2-17 03:21:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
关注我,每天学习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库:
  1. pie install selenium
复制代码
3. 下载欣赏器驱动

Selenium必要相干的欣赏器驱动步调来与欣赏器举行交互。你必要下载并安装实用于你所使用的欣赏器和使用体系的驱动。下面是各个欣赏器对应的驱动下载链接:

  • 「Chrome」:http://chromedriver.chromium.org/downloads
下载后,将驱动步调解压并将可实行文件地点的路径添加到体系的环境变量中。由于我用的是谷歌的以是这么保举。
4. 编写Python脚本:

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

二丶源码实现

如图所示。步调运行玩提示:「抢票完成」,但是如今只实用于网页版,以是部分得不可,实用APP版等我转头研究好了,在重新阐明。「尚有肯定要留意你的网速哦」
源码如下:
  1. import os  # 创建文件夹, 文件是否存在  
  2. import time  # time 计时  
  3. import pickle  # 保存和读取cookie实现免登陆的一个工具  
  4. from time import sleep  
  5. from selenium import webdriver  # 操作浏览器的工具  
  6. from selenium.webdriver.common.by import By  
  7.   
  8. """  
  9. 一. 实现免登陆  
  10. 二. 抢票并且下单  
  11. """  
  12. # 大麦网主页  
  13. damai_url = 'https://www.damai.cn/'  
  14. # 登录  
  15. login_url = 'https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F'  
  16. # 抢票目标页  
  17. target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.home.card_0.ditem_2.591b23e1AyXdAl&id=729700971838'  
  18.   
  19.   
  20. # class Concert:  
  21. class Concert:  
  22.     # 初始化加载  
  23.     def __init__(self):  
  24.         self.status = 0  # 状态, 表示当前操作执行到了哪个步骤  
  25.         self.login_method = 1  # {0:模拟登录, 1:cookie登录}自行选择登录的方式  
  26.         self.driver = webdriver.Chrome(executable_path='chromedriver.exe')  # 当前浏览器驱动对象  
  27.   
  28.     # cookies: 登录网站时出现的 记录用户信息用的  
  29.     def set_cookies(self):  
  30.         """cookies: 登录网站时出现的 记录用户信息用的"""  
  31.         self.driver.get(damai_url)  
  32.         print('###请点击登录###')  
  33.         # 我没有点击登录,就会一直延时在首页, 不会进行跳转  
  34.         while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:  
  35.             sleep(1)  
  36.         print('###请扫码登录###')  
  37.         # 没有登录成功  
  38.         while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':  
  39.             sleep(1)  
  40.         # get_cookies: driver里面的方法  
  41.         pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))  
  42.         print('###cookie保存成功###')  
  43.         self.driver.get(target_url)  
  44.   
  45.     # 假如说我现在本地有 cookies.pkl 那么 直接获取  
  46.     def get_cookie(self):  
  47.         """假如说我现在本地有 cookies.pkl 那么 直接获取"""  
  48.         cookies = pickle.load(open('cookies.pkl', 'rb'))  
  49.         for cookie in cookies:  
  50.             cookie_dict = {  
  51.                 'domain': '.damai.cn',  # 必须要有的, 否则就是假登录  
  52.                 'name': cookie.get('name'),  
  53.                 'value': cookie.get('value')  
  54.             }  
  55.             self.driver.add_cookie(cookie_dict)  
  56.         print('###载入cookie###')  
  57.   
  58.     def login(self):  
  59.         """登录"""  
  60.         if self.login_method == 0:  
  61.             self.driver.get(login_url)  
  62.             print('###开始登录###')  
  63.         elif self.login_method == 1:  
  64.             # 创建文件夹, 文件是否存在  
  65.             if not os.path.exists('cookies.pkl'):  
  66.                 self.set_cookies()  # 没有文件的情况下, 登录一下  
  67.             else:  
  68.                 self.driver.get(target_url)  # 跳转到抢票页  
  69.                 self.get_cookie()  # 并且登录  
  70.   
  71.     def enter_concert(self):  
  72.         """打开浏览器"""  
  73.         print('###打开浏览器,进入大麦网###')  
  74.         # 调用登录  
  75.         self.login()  # 先登录再说  
  76.         self.driver.refresh()  # 刷新页面  
  77.         self.status = 2  # 登录成功标识  
  78.         print('###登录成功###')  
  79.         # 处理弹窗  
  80.         if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):  
  81.             self.driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()  
  82.   
  83.     # 二. 抢票并且下单  
  84.     def choose_ticket(self):  
  85.         """选票操作"""  
  86.         if self.status == 2:  
  87.             print('=' * 30)  
  88.             print('###开始进行日期及票价选择###')  
  89.             while self.driver.title.find("确认订单") == -1:  
  90.                 try:  
  91.                     buybutton = self.driver.find_element(By.CLASS_NAME, 'buybtn').text  
  92.                     if buybutton == '提交缺货登记':  
  93.                         self.status = 2  # 没有进行更改操作  
  94.                         self.driver.get(target_url)  # 刷新页面 继续执行操作  
  95.                     elif buybutton == '立即预定':  
  96.                         # 点击立即预定  
  97.                         self.driver.find_element('buybtn').click()  
  98.                         self.status = 3  
  99.                     elif buybutton == '立即购买':  
  100.                         self.driver.find_element(By.CLASS_NAME, 'buybtn').click()  
  101.                         self.status = 4  
  102.                     elif buybutton == '选座购买':  
  103.                         self.driver.find_element(By.CLASS_NAME, 'buybtn').click()  
  104.                         self.status = 5  
  105.                 except:  
  106.                     print('###没有跳转到订单结算界面###')  
  107.                 title = self.driver.title  
  108.                 if title == '选座购买':  
  109.                     # 选座购买的逻辑  
  110.                     self.choice_seats()  
  111.                 elif title == '确认订单':  
  112.                     # 实现下单的逻辑  
  113.                     while True:  
  114.                         # 如果标题为确认订单  
  115.                         print('正在加载.......')  
  116.                         # 如果当前购票人信息存在 就点击  
  117.                         if self.isElementExist('//*[@id="container"]/div/div[9]/button'):  
  118.                             # 下单操作  
  119.                             self.check_order()  
  120.                             break  
  121.   
  122.     def choice_seats(self):  
  123.         """选择座位"""  
  124.         while self.driver.title == '选座购买':  
  125.             while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):  
  126.                 print('请快速选择你想要的座位!!!')  
  127.             while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):  
  128.                 self.driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[2]/div[2]/button').click()  
  129.   
  130.     def check_order(self):  
  131.         """下单操作"""  
  132.         if self.status in [3, 4, 5]:  
  133.             print('###开始确认订单###')  
  134.             time.sleep(1)  
  135.             try:  
  136.                 # 默认选第一个购票人信息  
  137.                 self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()  
  138.             except Exception as e:  
  139.                 print('###购票人信息选中失败, 自行查看元素位置###')  
  140.                 print(e)  
  141.             # 最后一步提交订单  
  142.             time.sleep(0.5)  # 太快了不好, 影响加载 导致按钮点击无效  
  143.             self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[9]/button').click()  
  144.             time.sleep(20)  
  145.   
  146.     def isElementExist(self, element):  
  147.         """判断元素是否存在"""  
  148.         flag = True  
  149.         browser = self.driver  
  150.         try:  
  151.             browser.find_element(By.XPATH, element)  
  152.             return flag  
  153.         except:  
  154.             flag = False  
  155.             return flag  
  156.   
  157.     def finish(self):  
  158.         """抢票完成, 退出"""  
  159.         self.driver.quit()  
  160.   
  161.   
  162. if __name__ == '__main__':  
  163.     con = Concert()  
  164.     try:  
  165.         con.enter_concert()  # 打开浏览器  
  166.         con.choose_ticket()  # 选择座位  
  167.     except Exception as e:  
  168.         print(e)  
  169.         con.finish()
复制代码
必要留意的是,差别的购票网站大概会有差别的网页结构和交互方式。你大概必要使用Selenium提供的API来定位元素和模拟用户使用
别的,Selenium还支持Headless模式,可以在配景运行欣赏器以节省资源和进步服从。可以通过设置欣赏器选项来启用Headless模式。

有详细的配套教程以及源码,都已经打包好上传到百度云了,链接在文章末端处!

末了我本身整理了一些学习资料,盼望对你们有资助。
Python学习大纲
Python全部方向的技能点做的整理,形成各个范畴的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,包管本身学得较为全面。

入门学习视频

Python实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才气将本身的所学运用到实际当中去,这时间可以搞点实战案例来学习。


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表