Python selenium实现大麦网自动购票过程解析

作者:松鼠爱吃饼干 时间:2023-10-17 05:43:10 

先来看看完成后的效果是怎么样的

Python selenium实现大麦网自动购票过程解析

开发环境

  • 版 本:anaconda(python3.8.8)

  • 编辑器:pycharm

代码实现步骤

  • 实现免登陆

  • 选座并且下单

实现免登陆

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.6ee64d156yMCV9&id=672706937093&clicktitle=%E7%95%99%E5%A3%B0%E7%8E%A9%E5%85%B72022%E3%80%8C%E6%97%B6%E9%97%B4%E7%9A%84%E8%B7%A8%E5%BA%A6%E3%80%8D%E5%B7%A1%E6%BC%94Vol%C2%B71%20%E9%95%BF%E6%B2%99%E7%AB%99'

初始化加载

from selenium import webdriver  # 操作浏览器的工具
def __init__(self):
   self.status = 0   # 状态, 表示当前操作执行到了哪个步骤
   self.login_method = 1  # {0:模拟登录, 1:cookie登录}自行选择登录的方式
   self.driver = webdriver.Chrome(executable_path='chromedriver.exe')  # 当前浏览器驱动对象

登录

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()           # 并且登录

cookies: 登录网站时出现的

import time      

def set_cookies(self):
   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 = 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###')

运行代码可以得到所需要的cookis,这样就可以实现免登录

Python selenium实现大麦网自动购票过程解析

打开浏览器

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_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('正在加载.......')
                   # 如果当前购票人信息存在 就点击
                   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('###开始确认订单###')
       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()

判断元素是否存在

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()

来源:https://blog.csdn.net/m0_48405781/article/details/124672784

标签:Python,selenium,大麦网,自动购票
0
投稿

猜你喜欢

  • 献给写作者的 Markdown 新手指南

    2023-04-14 04:50:18
  • Python3.10的一些新特性原理分析

    2023-06-17 06:35:10
  • 深入理解 Python 中的多线程 新手必看

    2021-10-09 16:11:45
  • IDEA 2020 设置项目集成git 及svn和git之间的切换问题

    2022-11-23 20:02:14
  • 全网最细 Python 格式化输出用法讲解(推荐)

    2021-07-15 12:01:32
  • Python服务器创建虚拟环境跑代码

    2021-02-15 20:17:49
  • SQL 2005 sa islock用户不能正常登录的现象

    2008-12-05 15:49:00
  • python playwright之元素定位示例详解

    2023-06-14 01:08:41
  • CentOS7离线安装MySQL的教程详解

    2024-01-20 13:07:33
  • Python实现的KMeans聚类算法实例分析

    2021-06-28 04:44:49
  • Python中列表的常用操作详解

    2022-07-17 10:16:42
  • 最新idea2021注册码永久激活(激活到2100年)

    2023-06-21 01:42:42
  • python 工具类之Queue组件详解用法

    2023-08-05 23:59:10
  • 怎么样才能让ASP避免被SQL注入啊?

    2008-08-08 12:27:00
  • JavaScript观察者模式原理与用法实例详解

    2024-04-19 10:02:48
  • HTML中使背景图片自适应浏览器大小实例详解

    2024-05-02 16:18:32
  • MySQL 四种连接和多表查询详解

    2024-01-14 17:34:29
  • 快速入手Python字符编码

    2022-05-26 00:52:33
  • python获取酷狗音乐top500的下载地址 MP3格式

    2021-05-06 04:38:05
  • python基础教程之基本内置数据类型介绍

    2023-02-12 07:19:31
  • asp之家 网络编程 m.aspxhome.com