点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

少年易学老难成,一寸光阴不可轻。

炎热的夏天,正是换上短裤短裙晒身材的时候。但是,身材不好怎么办?运动是一个选择,特别是像我们程序员行业,天天坐在空调办公室,更应该出出汗,正所谓:冬练三九,夏练三伏。

下班后,约上公司的妹子,打打羽毛球,还没很惬意的事情嘛。

妹子满脸微笑的问你,周五几号场地啊?

你却说,没订到场地(尴尬,逃。。。)

求生欲极强的 pk 哥接着说,但是,我写了一套 Python 自动化抢票的程序,每次临近打球的时间点,会有人转让或者退掉的,用这套程序就能实现自动化定场地了。

妹子问,那这程序怎么用呢?你能给我分析分析讲解讲解吗?

效果展示

我们以周五一个时间段为例,这个时间段有些场地是没被预定的,我们用这程序能否正常预定成功?

程序执行完成后,我就会收到预订成功的邮件通知,在 10 分钟内付款就预订场地成功了。

我预定的是羽毛球场地,当然,这个网站还可以预订足球、篮球、网球等,输入关键字即可查找。

项目环境

语言:Python编辑器:Pycharm浏览器:Chrome

准备工作

我们要用 selenium 库操作浏览器进入预订场馆的官网,这时候的一个难点就是怎么绕过登录,因为我们看到,登录页面是需要输入加了噪音的图形验证码,要解这个图形验证码很麻烦,需要去噪点,切割建模,图像识别,而且最终识别率不是很高。

pk 哥之前的文章里介绍过怎么绕过网站的登录的方法:讲讲Python爬虫绕过登录的小技巧(链接可点击跳转),这个项目用了其中一种,启动带有缓存信息的 Chrome 浏览器来绕过图形验证码成功登录。

当然,我们需要事先手动登录定场地的网站,这时的网站就缓存了你的登录信息。

然后我们用文章里说的方法绕过图形验证码,从而绕过网站的登录,具体解析看这篇文章 讲讲Python爬虫绕过登录的小技巧(链接可点击跳转)

浏览器驱动问题

解决登录的问题后,我们就可以打开我们指定的网站了。

driver.get(url)

这时,可能会遇到一点小插曲,如果运行代码出现浏览器驱动提示的问题,提示我们浏览器驱动的版本和浏览器不匹配。

先检查下之前有没有下载 chromedriver,并放在 Python 安装的根目录下,有安装的话那就是版本不匹配,可能由于 Chrome 浏览器自动升级导致。

Chrome 驱动下载链接:

http://npm.taobao.org/mirrors/chromedriver/

下载对应版本的驱动,放在 Python 安装的根目录下,替换之前旧的驱动即可。

比如我的 Chrome 浏览器版本是 76.0,那我需要下载 chromedriver 版本也是 76.0.

源码分析

接下来我们分析下打开的官网链接。

分析链接

我们登录官网后,默认所在的地区是广州,当我选择自己的所在地上海时,这时地址后会加上城市 id 的参数 city_id。

这时,我们在搜索框中输入我们需要预订的场馆,点击查询,这时参数后面多了个搜索文本的参数 search_text。

我们去掉参数中的 random,和上面的 city_id 进行组合,最终的链接如下:

http://quyundong.com/search/searchResult?city_id=321&search_text=上海霜天羽毛球馆

这个链接打开的页面和上面是一样的。

这时,我们构建一个打开指定网址的方法,我们把 city_id 和 search_text 两个值作为参数。

这时我们开始操作页面进行预订,我挑几个重要的步骤给大家解析下。

切换新窗口

当我们在上面的页面点击立即预订按钮时,浏览器会新打开一个窗口,这时,selenium 还是会停留在上一个页面,我们需要切换到新窗口。

n = self.driver.window_handles           # 获取当前页句柄
self.driver.switch_to.window(n[1])       # 切换到新的网页窗口

选择预订时间

我们看到预订的日期每天是变动的,但是,也有不变的部分,也就是星期,通过代码调试,我们发现,这个日期是一个可调整的 href 超链接,星期是日期中的一部分。

所以我们用 selenium 中点击超链接文字中的部分文字来实现预订时间的选择。

driver.find_element_by_partial_link_text('周五').click()

滑动页面

我们知道,页面元素如果没有出现在页面可见区域,可能定位元素时会报错。所以我们需要一个可以滑动页面到指定位置的操作。

比如,我想预订的时间段是 18:00-19:00,为了让这个区域出现在页面中,pk 哥采用的思路是滑动页面,让 场馆介绍 出现在屏幕底部。

pk 哥用的方法是用 js 方法滑动页面。

scrollIntoView(false)

上面方法表示滑动页面,使指定的元素出现屏幕底部,具体写法如下:

scroll = "document.getElementById('detail').scrollIntoView(false)"  # 滚动屏幕,使元素出现在屏幕底部
self.driver.execute_script(scroll)

这里,我把预订星期和滑动功能一起封装成一个方法,并把预订时间作为参数。

循环判断场地状态

这时关键的一步,我们需要判断我们要订的这些场地的状态是否是可预定的,我们需要的场地如果全部不可预订的话,我们就隔一段时间刷新页面,重新判断。如果可以预订,就点击提交订单。

我们先来看看场地预订的状态判断,通过调试,我们发现,场地 td 标签中 status 表示预订的状态,其中 status 值为 0 的时候表示该场地可以被预订,当 status 值不为 0 时表示该场地不可被预订。

预订指定场地

上面的图中我们看到,每个时间段内有 9 个场地,前三个是 VIP 场地,价格是后面普通场地近 2 倍,根据我实地考察来看,VIP 场地没什么优势,所有我只想预订第 4 号到第 9 号场地。

我们复制某个时间的某个场地的 xpath,我们发现,xpath 前面都是一样的,不同的场地由后面的 td[] 决定,比如 td[4] 就表示第 4 号场地。

我们用个 for 循环,把 td[] 里的数字格式化就可以了。

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))

发送邮件

如果有场地可预定的话,就会自动点击场地并提交订单、确定订单、选择支付方式,发送邮件。

发送邮件的方法可以参考之前的旧文:30行Python代码实现自动收发邮件(链接可点击跳转)

代码稍做了修改,放在和本项目同一目录下,就可以在本项目中直接导入了。

在本项目中导入发送邮件的方法,当预订场地成功提交订单后,调用发送邮件的方法,然后退出 while 循环。

预订场地的部分代码如下:

判断完 4 号到 9 号场地后,如果没有场地后,页面随机等待 10 到 15 分钟后刷新页面,这个时间可以自行修改,不要设置时间太短太有规律而被禁 ip 就行。

最后,输入你要预订的场地名和预订的星期,调用函数运行即可达到我文章开头的效果。全部代码在公众号回复「运动」获取。

这个项目后续还可以优化下,比如让选择的星期多选,比如我想在周三、周四、周五任意一天去找场地,有合适的话就预订,这个优化我放在 Github 上,Github 大家点赞越多,我会优化越快哦。

最后,祝大家运动愉快,身材一级棒!

------------------ End -------------------

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

约妹子打球却没订到场地?Python自动化帮你搞定相关推荐

  1. 写简历没模板?别怕,这些开源项目帮你搞定!

    大家好,我是 JackTian. 今年因特殊原因,有一些小伙伴想着在年后跳槽找一份好工作,而恰恰无法预料到会发生这样的事情,所以导致失业甚至只能在原单位忍受着了. 找工作的第一件事情,就是写简历.往往 ...

  2. python自动化控制运动_Python +selenium自动化帮你预订运动场地

    导语 炎热的夏天,正是换上短裤短裙晒身材的时候.但是,身材不好怎么办?运动是一个选择,特别是像我们程序员行业,天天坐在空调办公室,更应该出出汗,正所谓:冬练三九,夏练三伏. 下班后,约上公司的妹子,打 ...

  3. OSChina 周一乱弹 ——别的妹子撒个娇就能搞定的事,我都用威胁

    2019独角兽企业重金招聘Python工程师标准>>> @董姐夫 : 守望先锋. 喜欢守望先锋,那么我们来听一下他的主题曲. <守望先锋>管弦乐风格主题曲 手机党少年们想 ...

  4. 卧槽!没想到,用Python竟能做五仁月饼

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货第一时间推给你!!! 再过几天就是八月十五了,又迎来了一年一度的中秋节.在我国大部分地区,中秋节 ...

  5. 正则表达式里转义字符_五分钟搞定正则表达式,如果没搞定,再加两分钟

    五分钟搞定正则表达式,如果没搞定,再加两分钟 [这是 ZY 第 18 篇原创文章] 文章概览 一.正则表达式介绍 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简 ...

  6. fedora mysql gui_fedora8安装 mysql++失败!!装了一个晚上没搞定!!伤心阿!

    fedora8安装 mysql++失败!!装了一个晚上没搞定!!伤心阿! 发布时间:2008-02-24 05:15:27来源:红联作者:lygzx [root@F8 mysql++-3.0.0]# ...

  7. jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用...

    jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用 先用谷歌浏览器抓包,抓到的包类似这样: 在jmeter里添加一个http请求,配置好参数,方法,端口,路径等, 勾选 ...

  8. 群里又会python的吗_自从会了Python在群里斗图就没输过,Python批量下载表情包!...

    原标题:自从会了Python在群里斗图就没输过,Python批量下载表情包! 导语 最近图慌,于是随便写了个表情包批量下载的脚本,没什么技术含量,纯娱乐性质. 让我们愉快地开始吧~ 开发工具 Pyth ...

  9. 搜索python设计题的微信公众号_appium+python自动化42-微信公众号 (可能以后会遇到也遇到切换不了webview的问题 记录再此 还没试)...

    前言 本篇介绍如何在微信公众号上自动化测试,以操作我的个人公众号:yoyoketang为例,没关注的,先微信关注了,再跟着操作 环境准备: python 3.6 appium 1.7以上版本 微信6. ...

最新文章

  1. 实践教程|PyTorch训练加速技巧
  2. Gitlab 生成 swagger 文档
  3. 【入门必读】产品经理如何培养自己的逻辑思维方式
  4. python文件读read()、readline()、readlines()对比
  5. 40岁“老程序员”的“辛酸”自述:
  6. Asp.net2.0 学习资源(转载)
  7. 融云任杰:强互动,RTC下一个“爆点”场景|拟合
  8. linux系统高级管理工具包,linux两大系统的包管理工具
  9. 我们在面临种种不良的飞鸽传书2012
  10. 基于flask的可视化动漫分析网站
  11. 高通APQ8074(骁龙800)处理器
  12. FineReport新建数据连接
  13. java switch贯穿_Java Switch语句贯穿问题
  14. 关于uIP的移植以及部分特性解析和勘误
  15. 乐游TGapi接口平台(接口商)
  16. Java发邮件(详解+源代码)
  17. AltiumDesigner(二):差分线、等长线(蛇形走)设置
  18. linux可用直播软件,linux 下的直播软件 nslive
  19. 英特尔主板快捷启动键_0基础学系统安装之如何设置开机从U盘启动,快捷热键启动大全...
  20. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

热门文章

  1. mysql查找会员真实姓名_从mysql数据里边分析某一字段是否为真实姓名的方法
  2. C语言:字符串反序输出
  3. 一个讨论 TOPVIEW 财富数据的论坛!
  4. 美国风投:要么拿着现金 要么到中国去投资
  5. 有感,小诗一篇《时间》
  6. 基于51系列单片机的(循迹、避障、蓝牙)智能小车(2)源代码
  7. java_凹凸曼打怪兽
  8. 批量多开独立Google浏览器
  9. java+python课程教室自动排课系统Vue+ElemenUI
  10. 家居行业智慧供应链协同管理平台供应链上下游一体化协同,提升管理效能