小成开发日记-----利用Python在互动吧网站自动抢票实战分析
作者:小成Charles
商业工作,学习交流请添加Vx:Lcc-Triumph
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/113999110
一、前言
事情是这样的,由于每天早上去图书馆都要提前在互动吧
网站上蹲点抢票,挺麻烦的,然后我老爸说,你怎么不自己写一个抢票软件,一句点醒了我,于是这款抢票程序来了。
二、思路设计
对于抢票这样的程序,难点并不是在写代码上,主要难点在于对网站源码的分析以及奇奇怪怪的情况的处理,这里选用Python
作为脚本语言。我们利用selenium+chromeDriver
模拟浏览器的登录。因为我们是用电脑模拟人点击,所以我们要知道订票所需要的所有步骤,这样才能自动化处理。
在购买一张票的所有流程主要就是登录然后购买,我们要先登录然后浏览器才会记住登录信息的cookies
,才能正常购买。
三、登录页面分析
这里我登录使用的网站利用浏览器模拟到移动端页面,因为移动端的页面比较简单,通过检查源码,我们很快就找到了两个输入框以及登录按钮对应的位置如图所示标签位置,这里通过class
选择器分别定位输入账号和输入密码的input分别是zc_sjK
和zc_sjK.mmkTxt
,可以写成 browser.find_element_by_class_name('zc_sjK')
和browser.find_element_by_class_name('zc_sjK.mmkTxt')
然后登陆按钮一样是find_element_by_css_selector('.blueBtn a')
这里很简单,获取到输入框的元素之后,send_keys()
来输入账号密码,之后对登录元素进行click()
就可以实现登录
登陆模块代码如下所示
def login(browser):browser.get('https://login.hudongba.com/login/?redirectUrl=https%3A%2F%2Fwww.haudongba.com%2Fcoupon_center')input_account = browser.find_element_by_class_name('zc_sjK')input_pswd = browser.find_element_by_class_name('zc_sjK.mmkTxt')btn_log = browser.find_element_by_css_selector('.blueBtn a')input_account.send_keys('your account')input_pswd.send_keys('your password')btn_log.click()
四、购买页面分析
首先我们打开需要抢票的页面,打开F12
检查网页源代码,找到报名按钮的标签元素,然后模拟点击,点击之后会出现二维码,二维码下面继续报名的链接点进去就可可以进入下一步了,这里用class
来确定按钮位置,可以写成 browser.find_element_by_class_name('myApply')
,然后就是链接的位置,同样用class来确定位置browser.find_element_by_class_name('font-3')
然后进入下一步就是填写个人信息的界面了,这里如图所示,我们发现如图右下角的css
代码对应的是这三个input
输入框,那我们可以利用css选择器来获取这三个input元素,可以写成browser.find_elements_by_css_selector('.pop_massage .dan_h .inpoutK input')
,这样获得的是一个数组,接下来对每个数组send_keys()
进行传值。
接下来我们需要点击立即报名按钮,这里我们在源码中找到立即报名的按钮标签对应的css代码块,同样的我们可以利用css选择器来定位对应的元素,这里就可以写成browser.find_element_by_css_selector('.moreApplyWrap .submit a')
然后对元素进行click()
处理就可以报名成功了!
上面对网页简单的分析之后,我们看看完整代码,注意这里利用的sleep主要是为了保证所有元素被完全加载后再进行调用,btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color')
这里是获取了我要报名
的按钮的颜色 ,因为如果是灰色的话说明当前不允许购票,下面进入循环,不断地刷新页面获取按钮颜色,直到为指定的蓝色,循环跳出。
def buy_ticket(browser):browser.get('https://www.hudongba.com/party/ppfb5.html?hdb_pos=manager_info')# click continue buytime.sleep(1)btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color')print(btn_color)# if the color is not blue ,it won`t be allowed you to order# then you can refresh the websitewhile 1:if btn_color == 'rgba(0, 153, 233, 1)':breakelse:browser.refresh()time.sleep(1)btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color')browser.find_element_by_class_name('myApply').click()btn_next = browser.find_element_by_class_name('font-3')btn_next.click()# input informationtime.sleep(1)input_elements = browser.find_elements_by_css_selector('.pop_massage .dan_h .inpoutK input')print(input_elements)input_elements[0].clear()input_elements[1].clear()input_elements[2].clear()input_elements[0].send_keys("小成Charles")input_elements[1].send_keys("123456785555")input_elements[2].send_keys("45645646464456211")# click blueBtnblue_btn = browser.find_element_by_css_selector('.moreApplyWrap .submit a')print(blue_btn)blue_btn.click()# jude success or failedtime.sleep(1)FLAG = browser.find_element_by_class_name('centerMsg')if len(FLAG) != 0:print("success")else:print("failed")
五、主函数代码分析
这里首先是初始化chrome浏览器,设置浏览器头标签为移动端user-agent
,移动端代码实现登录模块,调用过login函数之后,再把浏览器标识符换回成PC端,用来实现购票页面的模块(实践操作发现购票模块的移动端有些bug),这里browser.execute_cdp_cmd()
实现将浏览器标识进行转换,然后再运行buy_ticket(browser)
函数块就又是PC端了!
if __name__ == '__main__':# send_emails()USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.' \'4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4'chrome_options = webdriver.ChromeOptions()chrome_options.add_argument("--User-Agent=" + USER_AGENT)#chrome_options.add_argument('--headless')#这里实现将启动页面影藏browser = webdriver.Chrome(options=chrome_options)login(browser)# switch the chrome to PC option then open the URLbrowser.execute_cdp_cmd("Emulation.setUserAgentOverride", {"userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0"})buy_ticket(browser)
六、总结
这个程序本身是有很多bug的,原理上你需要对每个获取元素代码块进行异常捕获处理,以及异常后应该做出怎样的判断。完善代码后如果可以的话可以把程序放到服务器上24小时不断运行,这样才能真正实现自动抢票!
作者:小成Charles
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/113999110
商业工作,学习交流请添加Vx:Lcc-Triumph
小成开发日记-----利用Python在互动吧网站自动抢票实战分析相关推荐
- 利用Python在互动吧网站自动抢票实战分析!你学废了吗
一.前言 事情是这样的,由于每天早上去图书馆都要提前在互动吧网站上蹲点抢票,挺麻烦的,然后我老爸说,你怎么不自己写一个抢票软件,一句点醒了我,于是这款抢票程序来了. 二.思路设计 对于抢票这样的程序, ...
- 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)
作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...
- 周杰伦演唱会门票还能这样抢?看过来!我用Python实现了大麦网自动抢票功能
相信想去周董演唱会的大家都用过大麦网抢票吧? 可是-抢不到啊!!! 该说不说 我抢到了 那么,今天带大家用Python来制作一个自动抢票的脚本小程序! 知识点: 面向对象编程 selenium 操作浏 ...
- 【python教程入门学习】自动抢票之 12306 登录篇
逢年过节 12306 的票总是要靠抢,前几天小编就在抢周一去上海的票,实在是抢不到呀,就撸了一个自动抢票的脚本. 抢票的思路就是使用 selenium 模拟用户登录 12306 网站购票行为,登录后抓 ...
- Python selenium 实现大麦网自动抢票,简单的实现全购票过程
前言 大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域 今天,我们要用代码来实现他的购票过程 先来看看完成后的效果是怎么样的 开发环境 版 本:anaconda( ...
- Python脚本实现12306火车票自动抢票回家or旅游
最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正.话不多说,进入正题: 这个脚本目前只能刷一趟车的,人数可以是多个,支持 ...
- 请问python可以制作手机上自动抢票抢单这样的软件吗?
答:A.你是我的.猫 完全可以实现,你说的这个功能,需要的技术叫:Python爬虫. 下面是对应的学习资源: 推荐5个Python爬虫免费学习资源(附学习计划) 『福利推』让我找到Python工作的一 ...
- Linux 小程序开发日记(终章)(pyqt+yolov5)
Linux 小程序开发日记(终章) 哈喽大家好,我是爱喝欢乐水的柳橙汁,这一篇,是最后一篇啦.我会将所有个过程都梳理一遍. 关于代码的详细注释,大家就参考一下之前的笔记吧.这一篇博客我就放上我精简的代 ...
- linux桌面小程序开发日记3(pyqt5+yolov5)
linux桌面小程序开发日记3 vm虚拟机配置yolov5环境(Ubuntu 18.04) 最后一篇博客地址:https://blog.csdn.net/Liuchengzhizhi/article/ ...
最新文章
- java控制台next_java读取控制台输入以及next() ,nextLine(), nextInt() 和nextDouble()的比较...
- hdu4038贪心(最快上升倍率,好题)
- C#一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第100位数是多少, 用递归算法实现。...
- ECshop安装及报错解决方案总结
- 通过字符串的方式读取文件的内容
- Windows 64位下安装Redis超详细教程
- “Java引领技术人生”专题讲座——Java畅销书作者李刚巡讲活动
- 三、地址族与数据序列
- 国家测绘局制定的测绘与地理信息行业标准统计 (20110706)
- 辽宁大学计算机专科专业,2020辽宁大学计算机考研专业课调整
- 【观察】戴尔:为核心数据“保驾护航”,为数字化转型“拨云见日”
- 机器学习入门到进阶十本好书推荐
- 怎么查询逆水寒服务器角色信息,逆水寒服务器状态
- ac6005直连ap 如何配置_邀请实测搭档 完成AC+瘦AP经典组网_华为 AC6005_网络设备-中关村在线...
- flea-db使用之JPA接入
- CSS3 使用@font-face引入字体的兼容性方案及优化
- 2022-06-29 AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒。
- 西联汇款和Bharti Airtel向印度数百万银行账户和非洲移动钱包提供实时全球支付服务
- Mac下的spotlight无法搜索本地资源的解决办法
- 自动生成无课表(云南农业大学)
热门文章
- 还不了解Oauth2协议?这篇文章从入门到入土让你了解Oauth2以及Spring Security OAuth2 的使用
- 第一二天作业-BGP MPLS + OSPF分流互备做法
- FT232驱动安装不成功的解决方案
- 【Flume】Flume原理简述及示例实践
- 动态规划解决0-1背包问题详解(图文并茂)
- 适用于Webstorm的25个最佳Javascript插件
- Field usersMapper in com.example.test.impl.UsersServiceImpl required a bean of type ‘com.example.tes
- 推荐几款项目管理工具 总有一款适合你
- Go语言debug调试
- 两位数码管秒表c语言,单片机C语言编程实现双数码管可调秒表