⽤Python 制作⼀个⾃动抢票脚本
前⾔安卓签名文件
⼤麦⽹,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、⾳乐剧、体育赛事等领域。
但是因为票数有限,还有黄⽜们不能丢了饭碗,所以导致了,很多⼈都抢不到票
那么,今天带⼤家⽤Python来制作⼀个⾃动抢票的脚本⼩程序
知识点:
⾯向对象编程
selenium 操作浏览器
pickle 保存和读取Cookie实现免登陆
time 做延时操作
os 创建⽂件,判断⽂件是否存在
开发环境:
版 本:python3.8.8
编辑器:pycharm
第⼀步,实现免登录
确定⽬标,设置全局变量
初始化加载
登录调⽤设置cookie # ⼤麦⽹主页damai_url = "www.damai/"# 登录页login_url = "passport.damai/login?ru=https%3A%2F%2Fwww.damai%2F"# 抢票⽬标页target_url = 'https ://detail .damai /item .htm?spm =a2oeg .search_category .0.0.77f24d15RWgT4o &id =654534889506&clicktitle =%E5%A4%A7%E4%1
2
3
4
56class  Concert :    def  __init__(self ):        self .status = 0        # 状态,表⽰如今进⾏到何种程度        self .login_method = 1  # {0:模拟登录,1:Cookie 登录}⾃⾏选择登录⽅式        self .driver = webdriver .Chrome (executable_path ='')        # 默认Chrome 浏览器
1
2
3
4
5def  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 )
1
2
3
4
5
6
7
8
9
10
11
12
13
登录
打开浏览器
第⼆步,抢票并下单
判断元素是否存在    try :        cookies = pickle .load (open ("cookies.pkl", "rb"))  # 载⼊cookie        for  cookie in  cookies :            cookie_dict = {                'domain':'.damai',  # 必须有,不然就是假登录                'name': cookie .get ('name'),                'value': cookie .get ('value')            }            self .driver .add_cookie (cookie_dict )        print ('###载⼊Cookie###')    except  Exception as  e :        print (e )
2
3
45
6
7
8
9
10
11
12
13    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 ()1
2iview的upload组件api
3
4
5
6
7
8
9
10
11
12
13def  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 ()1
2
3
4
5
6
7
8
9
10
11
12def  isElementExist (self , element ):    flag = True    browser = self .driver    try :        browser .find_element_by_xpath (element )        return  flag    except :        flag = False        return  flag
1
2
3
4
5
6
7
8
9python在线编辑器python3
10
选择座位
下单操作    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  s
elf .isElementExist ('//*[@id="container"]/div/div[9]/button'):                        self .check_order ()                        break
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25linux下载gcc命令
26
27
28
29
30
31
32
33
34
35
translate to english36
37
38    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 ()1
2
3
4
5
6
7
8
9
抢票完成,退出
测试代码是否成功
最后看下效果如何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 ()1
2
3
4
5
6
7
8
9
10
11
12def  finish (self ):    self .driver .quit ()
1
2if  __name__ == '__main__':    try :        con = Concert ()            # 具体如果填写请查看类中的初始化函数        con .enter_concert ()        # 打开浏览器        con .choose_ticket ()        # 开始抢票    except  Exception as  e :        print (e )        con .finish ()
1
2
3
4jdk为什么安装了打不开
5
6
7
8
9

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。