⽤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小时内删除。
发表评论