基于selenium的大麦网演唱会抢票程序

erjian2021-08-2234621

基于selenium的大麦网演唱会抢票程序

自从我在知乎分享了代码,很多人都在关注,学了我的代码,很荣幸,哈哈。但是,很多人运行我的代码,却有这样那样的问题。一开始我很困惑。我知道一开始我可以尝试几次音乐会。为什么现在问题这么多?最后一段,时间自己刚好有事,关注,不多,我就在原来研究的基础上回答。很多答案可能没有触及要害。最近有人通过QQ来找我。我仔细看了一下,发现大麦网里的原页面源代码变化很大,所以我的原代码几乎是无效的。我的方法太依赖元素ID、等标签了。的页面源代码,所以它无法应对这种变化。Em,我会把最近的代码更新放在一边。不过总体思路是正确的,大家修改我的代码就可以用了~

完全码

在大麦网,像林俊杰这样的歌手的演唱会门票经常在时间一到就售罄。网速慢或者手慢的时候,只能对着屏幕叹气。所以有时候如果你愿意花这笔钱,你可能买不到机会去看。但其实这个问题并不难解决,而且手速慢?允许代码模拟操作。网速慢?你可以把程序放在阿里服务器上运行。而关键是写一个抢票程序!

说到抢票,像明星这样的线上票务节目很多,但关于大麦网的不多,但核心本质都是一样的:模拟。其实这类程序在某种程度上类似于爬虫,所以我们可以想到、等模块。一开始是为了方便懒洋洋的使用,包也挺简单,但是功能少,文档不全,线上资料少。后来觉得主要用这个模块解决不了自动登录的问题,就放弃了,改用了selenium。接下来我会从账号登录、演唱会选择、购票、订单确认四个方面来讲解思路。

1.帐户登录

既然是抢票,希望节目在给出演唱会信息后能立即运行,不需要其他人工干预。这就要求我们的账号在抢票前可以自动登录绑定。其实实现自动登录有两种方式:Cookie模拟登录。使用Cookies(原理:如果你的Cookies记录在服务器端的$_COOKIE函数中,可以直接调用登录;如果没有,则需要手动登录。登录后,您可以通过访问界面两次,将您的COOKIE保存到$_COOKIE函数中。)这种方式其实很方便,在本地保存需要打电话,相当于带了一个进出皇宫的令牌,不用每次进入都自己检查。但是Cookie涉及到过期的问题,也存在很大的安全隐患。于是我决定玩另一种方式,——模拟登录。

大麦网登录界面如下:

我们需要做的是填写账号密码,然后点击登录。其实手动登录到这里就完成了。但是,在用代码填充内容后,单击登录,会出现一个惊喜。按钮上方突然出现一个滑块,红字表示您需要将滑块滑动到最右侧,然后再单击登录。所以接下来,除了填充内容和点击按钮,我们还需要滑动滑块。(我试着模拟手动填写信息来避开这个滑块,但我不能作弊,必须直接面对问题。)

说实话,因为缺乏经验,我花了好几个小时才填完内容。原因是这个登录框实际上是一个网页,封装在iframe标签中。作为一个外部网页的子界面,无论我使用哪个工具包,id、类、xpath等等。我找不到帐号框和密码框。当我注意到pit iframe时,我意识到我应该使用下面的句子来定位子页面。

自己。

驾驶员。

切换到帧

阿里巴巴-登录框

)

#里面这个是iframe的id

接下来,很简单,找到两个框和一个按钮,然后点击按钮,确保滑块顺从地出现。

自我。司机。按标识查找元素.send _ keys(自我。uid)自我。司机。按标识查找元素.send _ keys(自我。自我。司机。find _ element _ by _ tag _ name(按钮)。点击()

然后,想想自己是怎么滑动滑块的,在滑块处按下左键不动,移动鼠标向右,到最右边,然后松手。要模拟这个过程就需要用到行动链了。

ActionChains(自我驱动程序).点击并保持(自我。司机。find _ element _ by _ id(NC _ 1 _ n1z)).执行()#按住滑块不动ActionChains(自我驱动程序).move_by_offset(xoffset=250,yoffset=0).执行()#直接到终点,可能速度太快,会被系统判错误操作(这也是我不用拖放这个函数的原因),快到终点时停下福里兰格(2):行动链(自动驾驶)。move_by_offset(xoffset=10,yoffset=0).执行()#再慢慢滑两步睡眠(0.1)睡眠(0.5)#滑完了之后稍等下,让系统判断完毕ActionChains(自我驱动程序).释放()。执行()#松开点击自我。司机。find _ element _ by _ tag _ name(按钮)。单击()#点击登录

结束了之后,记得加上下

面这句话,从iframe切换出去。

self.driver.switch_to_default_content()

但是

,过了两天,我发现这个代码在我的电脑上失效了(别人那里好像是可以的)。。。不知道什么原因,selenium打开浏览器之后,无论是代码滑动滑块还是我手动滑动滑块,都是被判无效的,但是我自己打开浏览器操作是可以的。我觉得我可能是被针对了(以前也碰到过两次),感觉没有办法解决之后,我开始着手用其他方式解决自动登录——Cookie。其实吧,这个是套路,直接贴代码就行了,有一个地方需要注意注意注意,重要的事情说三遍,因为网上的教程在这个地方很多都是错的,从而导致我当时代码调得差点自闭了。

defget_cookie(self):self.driver.get(damai_url)print(###请点击登录###)whileself.driver.title.find(大麦网-全球演出赛事官方购票平台)!=-1:sleep(1)print(###请扫码登录###)whileself.driver.title==中文登录:sleep(1)print(###扫码成功###)pickle.dump(self.driver.get_cookies(),open(cookies.pkl,wb))print(###Cookie保存成功###)defset_cookie(self):try:cookies=pickle.load(open(cookies.pkl,rb))#载入cookieforcookieincookies:cookie_dict={domain:.damai.cn,#必须有,不然就是假登录name:cookie.get(name),value:cookie.get(value),expires:,path:/,httpOnly:False,HostOnly:False,Secure:False}self.driver.add_cookie(cookie_dict)print(###载入Cookie###)exceptExceptionase:print(e)

之后只要如此调用就可以了。

ifnotos.path.exists(cookies.pkl):#如果不存在cookie.pkl,就获取一下self.get_cookie()else:self.driver.get(damai_url)self.set_cookie()

2.选择演唱会

接下来就很直接了。

self.driver.find_elements_by_xpath(/html/body/div[1]/div/div[4]/input)[0].send_keys(self.name)#找到搜索栏,填入演唱会歌星的名字self.driver.find_elements_by_xpath(/html/body/div[1]/div/div[4]/div[1])[0].click()#点击旁边的搜索按钮

kinds=self.driver.find_element_by_id(category_filter_id).find_elements_by_tag_name(li)#选择演唱会类别forkinkinds:ifk.text==演唱会:k.click()breaklists=self.driver.find_elements_by_id(content_list)[0].find_elements_by_tag_name(li)#获取所有可能演唱会titles=[]links=[]self.choose_result=0forliinlists:word_link=li.find_element_by_tag_name(h3)titles.append(word_link.text)temp_s=word_link.get_attribute(innerHTML).find(href)+6temp_e=word_link.get_attribute(innerHTML).find(target)-2links.append(word_link.get_attribute(innerHTML)[temp_s:temp_e])ifli.find_element_by_tag_name(h3).text.find(self.place)!=-1:#选择地点正确的演唱会self.choose_result=len(titles)breakself.url=https:+links[self.choose_result-1]self.driver.get(self.url)#载入至购买界面

3.购票

datelist=self.driver.find_element_by_id(performList).find_elements_by_tag_name(li)#根据优先级选择一个可行日期foriinself.date:j=datelist[i-1].get_attribute(class)ifj==itm:datelist[i-1].click()breakelifj==itmitm-sel:breakelifj==itmitm-oos:continuesleep(1)pricelist=self.driver.find_element_by_id(priceList).find_elements_by_tag_name(li)#根据优先级选择一个可行票价foriinself.price:j=pricelist[i-1].get_attribute(class)ifj==itm:pricelist[i-1].click()breakelifj==itmitm-sel:breakelifj==itmitm-oos:continuesleep(1.5)cart=self.driver.find_element_by_id(cartList)try:#各种按钮的点击try:cart.find_element_by_class_name(ops).find_element_by_link_text(立即预定).click()self.status=3except:cart.find_element_by_class_name(ops).find_element_by_link_text(立即购买).click()self.status=4except:cart.find_element_by_class_name(ops).find_element_by_link_text(选座购买).click()self.status=5self.num+=1sleep(0.5)

接下来就是要点击确定了,但是这个确定按钮有三类:立即预定、立即购买、选座购买,我们需要分别处理。如果出错,就刷新界面

cart=self.driver.find_element_by_id(cartList)try:#各种按钮的点击try:cart.find_element_by_class_name(ops).find_element_by_link_text(立即预定).click()self.status=3except:cart.find_element_by_class_name(ops).find_element_by_link_text(立即购买).click()self.status=4except:cart.find_element_by_class_name(ops).find_element_by_link_text(选座购买).click()self.status=5

如果没有成功跳转,我没抢票的经验,不知道接下来会出现什么,所以也不知道要怎么具体应对,所以就刷新页面,重复上述操作,只能暂时这么粗暴地来了。

4.确认订单

点击选座购买,如果跳转成功,接下来就是选座了,这个有点小麻烦,暂时没写代码应对,开始交给人工处理。

点击立即预定和立即购买后如果正常跳转,之后就是确认订单信息与结算了,这时会有好多类型的界面,但是其中两类界面占了大多数,所以我就针对这两类进行编程。

因为这个时候的界面涉及很多隐私信息,我就不放出来了,虽然可以打码,但是我就是不想放。大致的操作其实和前面是类似的:找到目标,点击。

print(###开始确认订单###)print(###默认购票人信息###)rn_button=self.driver.find_elements_by_xpath(/html/body/div[3]/div[3]/div[2]/div[2]/div/a)iflen(rn_button)==1:#如果要求实名制print(###选择实名制信息###)rn_button[0].click()#选择实名信息tb=self.driver.find_element_by_xpath(/html/body/div[3]/div[3]/div[12]/div)lb=tb.find_elements_by_tag_name(label)[self.real_name]#选择第self.real_name个实名者lb.find_elements_by_tag_name(td)[0].click()tb.find_element_by_class_name(one-btn).click()print(###默认选择付款方式###)print(###确认商品清单###)rn_button=self.driver.find_elements_by_xpath(/html/body/div[3]/div[3]/div[3]/div[2]/div[2]/div/div/h2/a[1])iflen(rn_button)==1:#如果要求实名制print(###选择购票人信息###)rn_button[0].click()#选择实名信息tb=self.driver.find_element_by_xpath(/html/body/div[3]/div[3]/div[13]/div)lb=tb.find_elements_by_tag_name(label)[self.real_name]#选择第self.real_name个实名者lb.find_elements_by_tag_name(td)[0].click()tb.find_element_by_class_name(one-btn).click()print(###不选择订单优惠###)print(###请在付款完成后下载大麦APP进入订单详情页申请开具###)self.driver.find_element_by_id(orderConfirmSubmit).click()#同意以上协议并提交订单sleep(8)

基于selenium的大麦网演唱会抢票程序

相关阅读

  • 【献给第一次抢票的米】大麦网抢票流程 有几个问题问下大家 求解答 【dota2大麦网抢票吧】
  • 大麦网抢票有什么攻略?
  • 大麦网怎么抢票最快?大麦网先付先抢快速抢票流程攻略
  • 大麦网抢票软件
  • 大麦网怎么抢票 特别害怕抢不到票 几十秒后 票就没了?
  • 大麦网抢票
  • 大麦网怎么抢票最快?大麦网先付先抢快速抢票流程攻略
  • 大麦网抢票有什么攻略?
  • 基于selenium的大麦网演唱会抢票程序
  • 本文链接:http://www.slxf119.com/613.html 转载需授权!

    大麦网抢票

    上一篇:大麦网抢票有什么攻略?

    下一篇:【献给第一次抢票的米】大麦网抢票流程 有几个问题问下大家 求解答 【dota2大麦网抢票吧】

    相关文章

    网友评论