临近放假,相信我们每天都在群聊里或者朋友圈看到一些帮忙抢火车票的信息。看到朋友们抢回家的车票这么辛(bei)苦(can),结合圈里一些前辈的指点,抱着学习的心态用Python做了一个简单的自动化抢票程序,抢到票之后通过绑定的邮箱(比如QQ)发通知。下面分享主要内容:

版本号 Python 3.6.5

编译器 PyCharm PRO 2018.1

浏览器 Google Chrome 71.0.3

首先,我们用到一个Splinter库:

相信做自动化测试、自动化爬虫的朋友都知道Selenium工具,它可以把人为驱动行为转化为机器执行,Splinter的药效跟它是一样的。我们可以进去cmd后用 pip install splinter

这个命令来安装。

然后,开始使劲地码:

1. 定义自动购票的类(初始化属性)

class Buy_Tickets(object):# 定义实例属性,初始化def __init__(self, username, passwd, order, passengers, dtime, starts, ends):self.username = usernameself.passwd = passwdself.order = order # 车次,0代表所有车次self.passengers = passengers # 乘客名self.starts = starts # 起始地和终点self.ends = endsself.dtime = dtime # 日期self.login_url = 'https://kyfw.12306.cn/otn/login/init'self.initMy_url = 'https://kyfw.12306.cn/otn/view/index.html'self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'self.driver_name = 'chrome'self.executable_path = 'C:\python\chromedriver.exe'

2. 实现登录功能

def login(self):self.driver.visit(self.login_url)self.driver.fill('loginUserDTO.user_name', self.username)# sleep(1)self.driver.fill('userDTO.password', self.passwd)# sleep(1)print('请输入验证码...')while True:if self.driver.url != self.initMy_url:sleep(1)else:break

3. 实现购票功能

def start_buy(self):self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)# 窗口大小的操作self.driver.driver.set_window_size(1200, 700)self.login()self.driver.visit(self.ticket_url)try:print('开始购票...')# 加载查询信息self.driver.cookies.add({"_jc_save_fromStation": self.starts})self.driver.cookies.add({"_jc_save_toStation": self.ends})self.driver.cookies.add({"_jc_save_fromDate": self.dtime})self.driver.reload()count = 0if self.order != 0:while self.driver.url == self.ticket_url:self.driver.find_by_text('查询').click()count += 1print('第%d次点击查询...' % count)try:self.driver.find_by_text('预订')[self.order - 1].click()sleep(1.5)except Exception as e:print(e)print('预订失败...')continue

4. 邮箱通知付款

def sendMail(self, mail_title, mail_content):my_sender = 'xxx@qq.com' # 发件人邮箱账号my_user = 'xxxx@qq.com' # 收件人邮箱账号try:'''发送邮件'''msg = MIMEText(mail_content, "plain", 'utf-8') # 发送邮件内容msg["Subject"] = Header(mail_title, 'utf-8') # 发送邮件主题/标题msg["From"] = formataddr(['Bruce pk', my_sender]) # 邮件发送方msg["To"] = formataddr(['brucepk', my_user]) # 邮件接收方s = smtplib.SMTP("smtp.qq.com", 25) # 邮箱的传输协议,端口默认25s.login(my_sender, 'xxxxx') # 登录邮箱,这里的第二个参数为qq邮箱授权码,不要填你的登录密码s.sendmail(my_sender, [my_user, ], msg.as_string()) # 发送方,接收方,发送消息s.quit() # 退出邮箱print("抢票通知邮件发送成功!")except Exception:print("邮件发送失败~~")

还有,网络不好或者12306的服务器不稳定的时候,就会卡住,针对这种情况,系统会重复查询:

else:while self.driver.url == self.ticket_url:self.driver.find_by_text('查询').click()count += 1print('第%d次点击查询...' % count)try:for i in self.driver.find_by_text('预订'):i.click()sleep(1)except Exception as e:print(e)print('预订失败...')continueprint('开始预订...')sleep(1)print('开始选择用户...')for p in self.passengers:self.driver.find_by_text(p).last.click()sleep(0.5)if p[-1] == ')':self.driver.find_by_id('dialog_xsertcj_ok').click()sleep(3)print('提交订单...')self.driver.find_by_id('submitOrder_id').click()sleep(5)print('确认选座...')self.driver.find_by_id('qr_submit_id').click()print('预订成功...')sleep(5)self.sendMail(mail_title, mail_content)except Exception as e:print(e)

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Python:基于Python爬虫技术的抢票程序及其实现相关推荐

  1. 从爬虫构建数据集到CNN模型的验证码识别,一步一步搭建基于Python的PC个人端12306抢票程序

    写在前面:这个程序不是一个人能在短时间内完成的,感谢达纳,王哥的支持帮助.也感谢小平老师,没有压迫,就没有项目. 简介:这是一篇很硬核的Blog, 有一定Python基础的童鞋方能看懂,本程序的主要内 ...

  2. Python制作【大麦网】抢票程序,看演唱会再也不怕没票了

    前言 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域. 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 那么,今天带大家用Python ...

  3. Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集的下载(基于python语言根据爬虫技术自动下载MNIST数据集)

    Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集的下载(基于python语言根据爬虫技术自动下载MNIST数据集) 目录 数据集下载的所有代码 1.主文件 mni ...

  4. python网络爬虫_python小知识,基于Python 的网络爬虫技术分析

    在现阶段大数据的时代中,想要实现对数据的获取和分析,要先具备足够的数据源,网络爬虫技术就为其数据获取提供了良好的条件,且还能够实现对数据源的目的性采集. 在网络爬虫技术应用中,Python 脚本语言的 ...

  5. 爬虫技术python流程图_基于Python的网络爬虫技术研究

    基于 Python 的网络爬虫技术研究 王碧瑶 [摘 要] 摘要:专用型的网络爬虫能够得到想要的返回结果 , 本文就以拉勾网作 为例子 , 对基于 Python 的网络爬虫技术进行研究和分析. [期刊 ...

  6. python演唱会抢票脚本_基于selenium的大麦网演唱会抢票程序

    自从我在知乎分享了代码后,很多人关注了我的代码,自己也很荣幸,哈哈.但是好多人运行我的代码却出现了这样那样的问题,我刚开始也很纳闷,明明自己当初试了好几个演唱会都可以,为什么现在有这么多问题,上段时间 ...

  7. 基于python的网络爬虫技术_基于python的网络爬虫技术的研究

    龙源期刊网 http://www.qikan.com.cn 基于 python 的网络爬虫技术的研究 作者:刘文辉 李丽

  8. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  9. python网络爬虫技术-基于Python的网络爬虫技术综述

    汪洋 姜新通 [摘 要]人类社会已经进入大数据时代,这正在改变着我们的工作和生活.随着互联网的兴起和发展,同时也产生了各种对人类有价值的数据.快速搜索数据和充分利用数据信息已成为一个巨大挑战.这样的需 ...

最新文章

  1. win8安装11gR2[INS-13001] 环境不满足最低要求
  2. 将Doc或者Docx文档处理成html的代码逻辑;统计word中的字数,段数,句数,读取word中文档内容的代码逻辑
  3. spring boot security ajax_Spring-Boot-应用可视化监控
  4. 几款远程工具介绍(Xshell)(SecureCRT)(putty)
  5. 解决vue多个路由共用一个页面的问题
  6. .a 和.o 合并成一个.a_污水处理A/A/O工艺调试运行体会
  7. Oracle在SQL语句中对时间操作、运算
  8. 中国象棋棋谱棋书链接
  9. 我工作用的电脑十年没重装过一次系统,我是如何做到的
  10. wireshark 查找内容
  11. shopnc数据库操作
  12. 基于Flink的JDBC插入Nested结构数据到Clickhouse
  13. 【Codeforces Gym - 101635C Macarons 】【矩阵快速幂+状压】【dfs时间换空间】
  14. 数学之英文写作——基本中英文词汇(一般术语、算术与代数的常用词汇)
  15. vue改变class内的属性_vue绑定html的class属性的方法
  16. 2018互联网金融公司排名——Top100(附完整榜单)
  17. android listview视差滚动,android – ListView在滚动时覆盖另一个布局
  18. JAVA仿猫眼电影系统(毕业设计)
  19. mysql备库是什么_mysql如何避免备库出
  20. 【毕业设计】23-基于单片机的自动避障机器人设计(原理图+源代码+仿真+论文+答辩PPT)

热门文章

  1. Spring简介及历史
  2. CS5210设计HDMI to VGA方案 CS5210方案
  3. c盘无用文件怎么清理?
  4. VoLTE高丢包差小区分析处理流程
  5. js中原型,原型链,原型链继承的个人理解
  6. 王者荣耀服务器维护5.3,王者荣耀3月5日更新修复5个bug 王者荣耀bug修复介绍
  7. 数据库mysql无法远程访问,出现Host is not allowed to connect to this MySQL server解决办法
  8. FTp上传文件,创建文件夹
  9. Java设计模式之行为型:观察者模式
  10. dell r440服务器安装Ubuntu18.04