python自动化控制运动_Python +selenium自动化帮你预订运动场地
导语
炎热的夏天,正是换上短裤短裙晒身材的时候。但是,身材不好怎么办?运动是一个选择,特别是像我们程序员行业,天天坐在空调办公室,更应该出出汗,正所谓:冬练三九,夏练三伏。
下班后,约上公司的妹子,打打羽毛球,还没很惬的事情嘛。
妹子满脸微笑的问你,周五几号场地啊?
你却说,没订到场地(尴尬,逃。。。
求生欲极强的 pk 哥接着说,但是,我写了一套 Python 自动化抢票的程序,每次临近打球的时间,会有人转让或者退掉的,用这套程序就能实现自动化定场地了。
妹子问,那这程序怎么用呢?你能给我分析分析讲解讲解吗?
效果展示
我们以周五一个时间段为例,这个时间段有些场地时没被预定的,我们用这程序能否正常预定成功?
效果视频请在公众号 「Python 知识圈」里查看。
上面视频执行完成后,我就会收到预订成功的邮件通知,在 10 分钟内付款就预订场地成功了。
项目环境
语言:Python
编辑器:Pycharm
浏览器:Chrome
准备工作
我们要用 selenium 库操作浏览器进入预订场馆的官网,这时候的一个难点就是怎么绕过登录,因为我们看到,登录页面是需要输入加了噪音的图形验证码,要解这个图形验证码很麻烦,需要去噪点,切割建模,比对识别,而且最终识别率不是很高。
pk 哥之前的文章里介绍过怎么绕过网站的登录的方法:讲讲Python爬虫绕过登录的小技巧,这个程序用了其中一种,启动带有缓存信息的 Chrome 浏览器来绕过图形验证码成功登录。
所以,我们需要事先手动登录定场地的网站。
然后我们用文章里说的方法绕过图形验证码,绕过网站的登录,具体解析看这篇文章讲讲Python爬虫绕过登录的小技巧
浏览器驱动问题
解决登录的问题后,我们就可以打开我们指定的网站了。
Python
driver.get(url)
1
driver.get(url)
这时,可能会遇到一点小插曲,如果运行代码出现浏览器驱动提示的问题,提示我们浏览器驱动的版本和浏览器不匹配。
先检查下之前有没有下载 chromedriver,并放在 Python 安装的根目录下,有安装的话那就是版本不匹配,可能由于 Chrome 浏览器自动升级导致。
驱动下载链接:http://npm.taobao.org/mirrors/chromedriver/
下载对应版本的驱动,放在 Python 安装的根目录下,替换之前旧的驱动即可。
比如我的 Chrome 浏览器版本是 76.0,那我需要下载 chromedriver 版本也是 76.0.
源码分析
接下来我们分析下打开的链接。
分析链接
我们登录官网后,默认所在的地区是广州,当我选择自己的所在地上海时,这时地址后会加上城市 id 的参数 city_id。
这时,我们在搜索框中输入我们需要预订的场馆,点击查询,这时参数后面多了个搜索文本的参数 search_text。
我们去掉参数中的 random,和上面的 city_id 进行组合,最终的链接如下:
Python
http://quyundong.com/search/searchResult?city_id=321&search_text=上海霜天羽毛球馆
1
http://quyundong.com/search/searchResult?city_id=321&search_text=上海霜天羽毛球馆
这个链接打开的页面和上面是一样的。这时,我们构建一个打开指定网址的方法,我们把 city_id 和 search_text 两个值作为参数。
这时我们开始操作页面进行预订,我挑几个重要的步骤给大家解析下。
切换新窗口
当我们在上面的页面点击立即预订按钮时,浏览器会新打开一个窗口,这时,selenium 还是会停留在上一个页面,我们需要切换到新窗口。
Python
n = self.driver.window_handles # 获取当前页句柄
self.driver.switch_to.window(n[1]) # 切换到新的网页窗口
1
2
n=self.driver.window_handles# 获取当前页句柄
self.driver.switch_to.window(n[1])# 切换到新的网页窗口
选择预订时间
我们看到预订的日期每天是变动的,但是,也有不变的部分,也就是星期,通过代码调试,我们发现,这个日期是一个可调整的 href 超链接,星期是日期中的一部分。
所以我们用 selenium 中点击超链接文字中的部分文字来实现预订时间的选择。
Python
driver.find_element_by_partial_link_text('周五').click()
1
driver.find_element_by_partial_link_text('周五').click()
滑动页面
我们知道,页面元素如果没有出现在页面可见区域,可能定位元素时会报错。所以我们需要一个可以滑动页面到指定位置的操作。
比如,我先预订的时间段是 18:00-19:00,为了让这个区域出现在页面中,pk 哥采用的思路是滑动页面,让场馆介绍出现在屏幕底部。
pk 哥用的方法是用 js 方法滑动页面。
Python
scrollIntoView(false)
1
scrollIntoView(false)
上面方法表示滑动页面,使指定的元素出现屏幕底部,具体写法如下:
Python
scroll = "document.getElementById('detail').scrollIntoView(false)" # 滚动屏幕,使元素出现在屏幕底部
self.driver.execute_script(scroll)
1
2
scroll="document.getElementById('detail').scrollIntoView(false)"# 滚动屏幕,使元素出现在屏幕底部
self.driver.execute_script(scroll)
这里,我把预订星期和滑动功能一起封装成一个方法,并把预订时间作为参数。
循环判断场地状态
这时关键的一步,我们需要判断我们要订的这些场地的状态是否是可预定的,我们需要的场地全部不可预订的话我们就隔一段时间就刷新页面,重新判断。如果可以预订,就点击提交订单。
我们先来看看场地预订的状态判断,通过调试,我们发现,场地标签中 status 表示预订的状态,其中 status 值为 0 的时候表示该场 地可以被预订,当 status 值不为 0 时表示该场地不可被预订。
订指定场地
上面的图中我们看到,每个时间段内有 9 个场地,前三个是 VIP 场地,价格是后面普通场地近 2 倍,根据我实地来看,VIP 场地没什么优势,所有我只想预订第 4 号到第 9 号场地。
我们复制某个时间的某个场地的 xpath,我们发现,xpath 前面都是一样的,不同的场地由后面的 td[] 决定,比如 td[4] 就表示第 4 号场地。
我们用个 for 循环,把 td[] 里的数字格式化就可以了。
Python
for i in range(4, 10): # 我只需要预定第4列和第9列的场地,也就是4号到9号场地
site = self.driver.find_element_by_xpath('//*[@id="booking"]/div[3]/div[1]/table/tbody/tr[9]/td[{}]'.format(i))
1
2
foriinrange(4,10):# 我只需要预定第4列和第9列的场地,也就是4号到9号场地
site=self.driver.find_element_by_xpath('//*[@id="booking"]/div[3]/div[1]/table/tbody/tr[9]/td[{}]'.format(i))
发送邮件
如果有场地可预定的话,就会自动点击场地并提交订单、确定订单、选择支付方式,发送邮件。
代码稍做了修改,放在和本项目同一目录下,就可以在本项目中直接导入了。
在本项目中导入发送邮件的方法,当预订场地成功提交订单后,调用发送邮件的方法,然后退出 while 循环。
预订场地的部分代码如下:
判断完 4 号到 9 号场地后,如果没有场地后,页面随机等待 10 到 15 分钟后刷新页面,这个时间可以自行修改,不要设置时间太短太有规律而被禁 ip 就行。
最后,输入你要预订的场地名和预订的星期,调用函数运行即可达到我文章开头的效果。全部代码在我公众号回复「球」获取。
这个项目后续还可以优化下,比如让选择的星期多选,比如我想在周三、周四、周五任意一天去找场地,有合适的话就预订,这个优化我放在 Github 上,Github 大家点赞越多,我会优化越快哦。
最后,祝大家玩球愉快,身材一级棒!
python自动化控制运动_Python +selenium自动化帮你预订运动场地相关推荐
- python自动化流程概念_python selenium 自动化流程的一些总结与思考
首先要考虑的项目为什么要做自动化测试?(主要从自动化测试的优点着手) 其次是什么项目才适合做自动化测试? 自动化测试覆盖率要达到什么样的程度?因为都知道不可能达到100%的,不然脚本太臃肿,反而会失去 ...
- python自动化办公选择题_Python +Selenium 自动化 css练习题
from selenium import webdriver from time import sleep driver=webdriver.Chrome(r'D:\Users\CT-LA\AppDa ...
- python模拟鼠标拖动_Python+Selenium自动化篇-6-模拟鼠标操作
在webdriver中,鼠标的一些操作如:双击.右击.悬停.拖动等都被封装在ActionChains类中,我们只用在需要使用的时候,导入这个类就可以了. 0.ActionChains类提供的鼠标常用方 ...
- python 头条 上传_Python+selenium自动化之文件上传
邮箱的主要功能就是邮件消息的收发阅读,之前的文章写了邮件的查收和编写,本篇介绍邮件的附件上传.还是以腾讯企业邮箱为例,进行实际案例操作. 文件上传的实现大体分为两种,一种是input标签,一种非inp ...
- python自动切换链接_python+selenium自动化(四)之selenium切换窗口
当我们点击某个链接时,切换换到另一个窗口,这时就需要跟随切换到新打开的页面,去定位元素. 1.获取当前页面句柄 current_window_handle importtimefrom seleni ...
- python如何控制浏览器_Python+selenium 控制浏览器
控制浏览器 driver.forward() # 浏览器前进 driver.back() # 浏览器后退 driver.refresh() # 刷新页面 driver.set_window_size( ...
- dnf自动刷图python脚本_python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]...
背景: Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励 目标:连续四天自动运行脚本,自动领取所 ...
- python 自动点击网页上按钮_python selenium自动化(一)点击页面链接测试
需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回到原始页面. 要完成这个需求就必须实现3点: 1. 找 ...
- android select下拉列表_Python+selenium自动化之下拉列表操作(一)
下拉列表操作中分为两种:select.非select 非select下拉列表操作 非select下拉列表的操作与其他元素的操作一致,定位元素,设置等待,操作元素. 下面还是以腾讯邮箱为例,查看一封邮件 ...
最新文章
- IHttpModule和IHttpHandler 应用笔记
- 伍迷创意随想集 之 烧菜小帮手
- 新浪微博Python客户端接口OAuth2
- Redis Cluster原理初步
- SPI、I2C、UART三种串行总线的原理、区别及应用
- CSS 元素超出部分滚动, 并隐藏滚动条
- 0基础学python要多久-自学Python要学多久可以学会?
- 搜索数据android ui,搜索概览 | Android 开发者 | Android Developers
- setInterval()与clearInterval()的用法
- ZZULIOJ1016
- 解压报错gzip: stdin: not in gzip format
- Toad:基于 Python 的标准化评分卡模型
- 记一个藏得很深的bug
- 游戏项目开发的简单流程
- 肥猫学习日记---数据结构与算法(三)-----链表
- 设计模式(二)--策略模式
- 英语学习-索贝斯演讲学习摘要
- VS粘贴word时中文乱码修复工具v1
- RoadFlow的流程的方法
- 华为路由器负载均衡_华为路由器双出口负载均衡+备份(示例代码)
热门文章
- 万字详解Docker架构原理、功能及使用
- 1024 程序员节:给 DBA 们的福音
- 当SQL Server爱上Linux:配置 SQL Server 2017 上的可用性组初体验
- 区块链交易隐私如何保证?华为零知识证明技术实战解析
- 红橙Darren Android视频笔记 自定义view的三个构造方法以及一种实现换肤的方案 测量mode
- js学习 字符串常用方法
- 从零开始学keras之过拟合与欠拟合
- java 批量插入clob_SpringBoot系列(16)线程池Executors并发编程之批量查询-插入数据
- 【java基础知识】java打包后再dos命令行中文显示乱码的问题
- opencv训练样本分类器