百木园-与人分享,
就是让自己快乐。

Python selenium 实现大麦网自动抢票,简单的实现全购票过程

前言

大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域
今天,我们要用代码来实现他的购票过程

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

对于本篇文章有疑问的同学可以加【资料白嫖、解答交流群:753182387】

开发环境

  • 版 本: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,这样就可以实现免登录

打开浏览器

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://www.cnblogs.com/qshhl/p/16263927.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Python selenium 实现大麦网自动抢票,简单的实现全购票过程

相关推荐

  • 暂无文章