Python制作【大麦网】自动抢票程序

前言

大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。

但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票

那么,今天带大家用Python来制作一个自动抢票的脚本小程序

知识点:

  • 面向对象编程

  • selenium 操作浏览器

  • pickle 保存和读取Cookie实现免登陆

  • time 做延时操作

  • os 创建文件,判断文件是否存在

开发环境:

  • 版 本:anaconda5.2.0(python3.6.5)

  • 编辑器:pycharm

【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学

先导入本次所需的模块

import osimport timeimport picklefrom time import sleepfrom 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()

最后看下效果如何

(0)

相关推荐

  • 第69天:Selenium详解

    Selenium 环境配置好之后,我们就可以使用 Selenium 来操作浏览器,做一些我们想做的事情了.在我们爬取网页过程中,经常发现我们想要获得的数据并不能简单的通过解析 HTML 代码获取,这些 ...

  • Selenium2+python自动化67-用例失败自动截图

    前言: 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数 上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装饰器改良了下,可以实现用例执行失败自动截图 ...

  • python中的other.a怎么理解?

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/python中的other.a怎么理解? 作者:融水公子 rsgz Python3 教程 Python3 教程 http://www.rsgz.t ...

  • Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 作者:阿里波特 来源:CSDN Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 h ...

  • 自动抢票之 12306 抢票篇

    来源:Python 技术「ID: pythonall」 大家好,这一篇是 12306 的自动预订车票篇,前篇已经撸完了 12306 的自动登录.小编希望小伙伴们能多给几个赞,以示鼓励. 查询车票 首先 ...

  • 大惊喜你一定要了解,12306在2019春节将开始支持自动抢票

    今天看到这个消息,真的很惊喜,但是却不意外.12306开始了自动抢票,要知道之前的春节,为了买到票,用过百度浏览器.火狐浏览器.360浏览器.阿里旅行APP.微信抢票--各种折腾,但是还是一票难求. ...

  • 自动抢票之 12306 登录篇

    来源:Python 技术「ID: pythonall」 逢年过节 12306 的票总是要靠抢,前几天小编就在抢周一去上海的票,实在是抢不到呀,就撸了一个自动抢票的脚本. 抢票的思路就是使用 selen ...

  • 12306给自己打90分你同意吗?大数据风控降低抢票软件成功率

    [数据猿导读] 12306技术团队为自己打90分以上,你同意吗? 记者 | 小北 官网 | www.datayuan.cn 微信公众号ID | datayuancn 2018年1月1日,春运正式开启. ...

  • 全网首发:12306抢票算法大曝光?(十张图搞定)

    前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识. 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人. 相信大家都有过抢票.刷票的经验,每年年底, ...

  • 2017年春运十大热门出发城市出炉 或成“史上最难抢票年”

    懂懂笔记 "史上最难抢票年"来了!12月7日,360在京发布了<2017年春运预测报告>.报告基于360浏览器历年的春运抢票大数据,从抢票热门省份.城市.路线.抢票高峰 ...

  • Python制作可视化大屏全流程!(代码分享)

    今天就详细讲一下Pyecharts制作可视化大屏的过程. 注意,本文由于篇幅问题不会放置全部代码,会在文末提供全部代码的下载. 承接上文<用Python制作可视化大屏,特简单!>,不再赘述 ...

  • 30行Python代码从百度自动下载图片(附小白也能看懂的源码和exe程序)

    只需要30行代码就可以从百度自动下载图片 大家好,我是黑羽,一个专门教小学生撸Python的编程老师(小学生都能学会的编程) 这里想问大家三个问题 : - 你还在为批量下载表情包发愁吗? - 你还在为 ...

  • 如何用Excel2分钟制作一个自动抽奖小程序?

    Hello小伙伴们,大家有没有在快乐的享受中秋假期呢.今天是中秋假期的第一天,小E给大家奉上两份礼物: 一个是能赢现金赢课程的抽奖: 另一个当然是Excel教程---教你两分钟用Excel做出一个超有 ...