为了顺利买到演唱会的票用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 相关文章推荐
python常规方法实现数组的全排列
Mar 17 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
在Python的Flask框架中实现单元测试的教程
Apr 20 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
Python调用百度根据经纬度查询地址的示例代码
Jul 07 Python
Django框架视图函数设计示例
Jul 29 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Python实现老照片修复之上色小技巧
Python anaconda安装库命令详解
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Python爬虫入门案例之爬取二手房源数据
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Python Django模型详解
You might like
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
Yii框架登录流程分析
2014/12/03 PHP
php实现插入排序
2015/03/29 PHP
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
浅谈javascript的调试
2015/01/28 Javascript
angularJS 入门基础
2015/02/09 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
javascript trie前缀树的示例
2018/01/29 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
详解Python是如何实现issubclass的
2019/07/24 Python
什么是python的自省
2020/06/21 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
印度服装购物网站:Limeroad
2018/09/26 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
物业管理应届生求职信
2013/10/28 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
工程建设实施方案
2014/03/14 职场文书
请假条的格式
2014/04/11 职场文书
不忘国耻振兴中华演讲稿
2014/05/14 职场文书
企业宣传标语
2014/06/09 职场文书
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers