Python selenium 实现大麦网自动抢票,简单的实现全购票过程

前言

大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域
今天,我们要用代码来实现他的购票过程

先来看看完成后的效果是怎么样的

对于本篇文章有疑问的同学可以加【资料白嫖、解答交流群:753182387】

开发环境

  • 版 本:anaconda(python3.8.8)
  • 编辑器:pycharm

代码实现步骤

  • 实现免登陆
  • 选座并且下单

实现免登陆

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.6ee64d156yMCV9&id=672706937093&clicktitle=%E7%95%99%E5%A3%B0%E7%8E%A9%E5%85%B72022%E3%80%8C%E6%97%B6%E9%97%B4%E7%9A%84%E8%B7%A8%E5%BA%A6%E3%80%8D%E5%B7%A1%E6%BC%94Vol%C2%B71%20%E9%95%BF%E6%B2%99%E7%AB%99  ' 

 

 初始化加载 
 from  selenium  import  webdriver   #  操作浏览器的工具 

 def   __init__  (self):
self.status
= 0 # 状态, 表示当前操作执行到了哪个步骤 self.login_method = 1 # {0:模拟登录, 1:cookie登录}自行选择登录的方式 self.driver = webdriver.Chrome(executable_path= ' chromedriver.exe ' ) # 当前浏览器驱动对象

 

登录

 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 ' ):
self.set_cookies()
# 没有文件的情况下, 登录一下 else :
self.driver.get(target_url)
# 跳转到抢票页 self.get_cookie() # 并且登录

 

cookies: 登录网站时出现的

 import  time  def  set_cookies(self):
self.driver.get(damai_url)
print ( ' ###请点击登录### ' ) # 我没有点击登录,就会一直延时在首页, 不会进行跳转 while self.driver.title.find( ' 大麦网-全球演出赛事官方购票平台 ' ) != -1 :
sleep(
1 ) print ( ' ###请扫码登录### ' ) # 没有登录成功 while self.driver.title != ' 大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座! ' :
sleep(
1 ) print ( ' ###扫码成功### ' ) # get_cookies: driver里面的方法 pickle.dump(self.driver.get_cookies(), open( ' cookies.pkl ' , ' wb ' )) print ( ' ###cookie保存成功### ' )
self.driver.get(target_url)

 

假如说我现在本地有 cookies.pkl 那么 直接获取

 def  get_cookie(self):
cookies
= pickle.load(open( ' cookies.pkl ' , ' rb ' )) 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### ' )

 

运行代码可以得到所需要的cookis,这样就可以实现免登录

打开浏览器

 def  enter_concert(self):  print ( '  ###打开浏览器,进入大麦网###  '  )  #  调用登录 
    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  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) # 刷新页面 继续执行操作 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 ( ' 正在加载....... ' ) # 如果当前购票人信息存在 就点击 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  '  ):  print ( '  请快速选择你想要的座位!!!  '  )  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( '  //*[@id="container"]/div/div[9]/button  ' ).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  finish(self):
self.driver.quit()

 

标签: python

添加新评论