为了顺利买到演唱会的票用Python制作了自动抢票的脚本


Posted in Python onOctober 16, 2021

知识点:

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

开发环境:

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

先导入本次所需的模块

import os
import time
import pickle
from time import sleep
from selenium import webdriver

第一步,实现免登录

确定目标,设置全局变量

# 大麦网主页
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):
    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 自动抢票内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
Python读写Redis数据库操作示例
Mar 18 Python
python实现逻辑回归的方法示例
May 02 Python
对python中Json与object转化的方法详解
Dec 31 Python
Python中的 is 和 == 以及字符串驻留机制详解
Jun 28 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
使用Python实现画一个中国地图
Nov 23 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 Python
关于python类SortedList详解
Sep 04 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Python实现老照片修复之上色小技巧
Python anaconda安装库命令详解
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Python爬虫入门案例之爬取二手房源数据
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Python Django模型详解
You might like
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
python根据出生日期获得年龄的方法
2015/03/31 Python
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
深入浅析python定时杀进程
2016/06/06 Python
深入了解Python数据类型之列表
2016/06/24 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python处理文本换行符实例代码
2018/02/03 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
Python新手学习装饰器
2020/06/04 Python
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
销售自我评价
2013/10/22 职场文书
小学家长会邀请函
2014/01/23 职场文书
标准化管理实施方案
2014/02/25 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
德育标兵事迹材料
2014/08/24 职场文书
英文感谢信范文
2015/01/21 职场文书
政协委员个人总结
2015/03/03 职场文书