2019独角兽企业重金招聘Python工程师标准>>>

又是一年,马上就要回家过年了,还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了?

俗话说的好,求人不如求自己,抢票这玩意,其实我觉得我也可以~

来来来,直接入正题吧! 这里有两种方案,一种是基于Selenium2的自动化框架控制浏览器实现,另一种方案则是基于Python自身的爬虫package如request,urllib等来实现,本文实现第一种方案,第二种方案也在摸索中。

实现过程

一、新版12306官网主要页面网址

https://kyfw.12306.cn/otn/resources/login.html
https://kyfw.12306.cn/otn/view/index.html
https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc

二、浏览器驱动信息

这里使用的是chrome浏览器

在此处下载
https://sites.google.com/a/chromium.org/chromedriver/downloads

三、初始化必要信息

买票必要信息,比如乘车人,来往车站,车次类型等等

# 乘客姓名
passengers_input = 'xxx'
passengers = passengers_input.split(",")#乘车日期,格式为2019-01-10
from_time = '2019-01-31'# 城市cookie字典
city_list = {'sz':'%u6DF1%u5733%2CSZQ', #深圳'zz':'%u90D1%u5DDE%2CZZF', #郑州'gz':'%u5E7F%u5DDE%2CGZQ', #广州
}
# 出发站
from_station = '%u5E7F%u5DDE%2CGZQ'# 终点站
to_station = '%u90D1%u5DDE%2CZZF'# 车次编号
numbers = ['Z90','Z190','Z14','Z168','Z98','T124','T370']# 座位类型
seat_type = '硬卧'#通知邮件
receiver_email = 'xxxxxxxxx@163.com'

注意:城市字典是将城市简写和城市代码之间联系起来。如果没有你想要到城市,可以在打开12306的查票页面,然后打开浏览器的开发者模式,输入对应的城市,然后查看请求信息。

四、登录功能实现

登录我们需要手动登录,扫码或者输入账号都可以。登录后记录session,供后面抢票使用


def do_login(self):"""登录功能实现,手动识别验证码进行登录"""self.driver.visit(self.login_url)sleep(1)# 选择登陆方式登陆print('请扫码登陆或者账号登陆……')while True:if self.driver.url != self.init_my_url:sleep(1)else:break

五、抢票功能实现

核心功能实现,通过扫描关键字来确认是否有余票,然后实现点击页面,进而走向下一步。

current_tr = self.driver.find_by_xpath('//tr[@datatran="' + number + '"]/preceding-sibling::tr[1]')
if current_tr:if current_tr.find_by_tag('td')[self.seat_type_index].text == '--':print('无此座位类型出售,已结束当前刷票,请重新开启!')sys.exit(1)else:# 有票,尝试预订print('刷到票了(余票数:' + str(current_tr.find_by_tag('td')[self.seat_type_index].text) + '),开始尝试预订……')current_tr.find_by_css('td.no-br>a')[0].click()sleep(1)key_value = 1for p in self.passengers:# 选择用户print('开始选择用户……')self.driver.find_by_text(p).last.click()# 选择座位类型print('开始选择席别……')if self.seat_type_value != 0:self.driver.find_by_xpath("//select[@id='seatType_" + str(key_value) + "']/option[@value='" + str(self.seat_type_value) + "']").first.click()key_value += 1sleep(0.2)if p[-1] == ')':self.driver.find_by_id('dialog_xsertcj_ok').click()print('正在提交订单……')self.driver.find_by_id('submitOrder_id').click()sleep(2)print('正在确认订单……')self.driver.find_by_id('qr_submit_id').click()

六、抢票成功后邮件通知自己

一个很简单的功能,不过却是必要的,避免自己错过!

def send_mail(self, receiver_address, content):"""发送邮件通知"""# 连接邮箱服务器信息host = 'xxxx.163.com'port = 25sender = 'xxxxxx@163.com'  # 你的发件邮箱号码pwd = 'xxxxx'  # 第三方授权登录吗,不是登录密码!!# 发件信息receiver = receiver_addressbody = '<h2>温馨提醒:</h2><p>' + content + '</p>'msg = MIMEText(body, 'html', _charset="utf-8")msg['subject'] = '抢票成功通知!'msg['from'] = sendermsg['to'] = receivers = smtplib.SMTP(host, port)# 开始登陆邮箱,并发送邮件s.login(sender, pwd)s.sendmail(sender, receiver, msg.as_string())

过程演示

  • 执行代码

  • 登录12306网站

  • 抢票成功

  • 等待支付

  • 邮件通知


总结:

总的来说是成功的,但还不是完全自动化的。不过相比手动抢票还是快很多的。其实网上这种代码很多,只不过因为12306网站的更新大多数不能用了,我也是在前辈们的基础上修改完成的。想要最新源码的同学可以关注的我公众号,回复抢票源码!

转载于:https://my.oschina.net/dingxiaoshui/blog/3000044

抢火车票这个事吧,其实我也能做!(python黑科技)相关推荐

  1. python刷票 黑科技_抢火车票这个事吧,其实我也能做!(python黑科技)

    又是一年,马上就要回家过年了,还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了? 俗话说的好,求人不如求自己,抢票这玩意,其实我觉得我也可以~ 来来来,直接入正题吧! 这里有两种方案, ...

  2. 无人便利店抢人饭碗?这些“黑科技”将创造百万就业

    "不用排队,不用付钱,拿起就走."亚马逊为旗下无人便利店Amazon Go拍摄的宣传视频中,人们面带微笑穿梭在超市里,离开的时候,交易已经自动在手机app上完成.在美国消费者眼里, ...

  3. 用python抢火车票

    原文地址:http://youerning.blog.51cto.com/10513771/1719159 前言:大家跟我一起念,Python***好,跟着本宝宝用Python抢火车票 首先我们需要s ...

  4. python抢火车票_听说你能用 Python 帮我抢火车票?!

    原标题:听说你能用 Python 帮我抢火车票?! 文 | 车栗子 来源 |量子位公众号 想要十一回家的小伙伴们,大概刚刚经历了一波抢票大战. 顺便把一个Python抢票工具,送到了GitHub趋势榜 ...

  5. 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)

    前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...

  6. Python 抢火车票神器,支持候补抢票

    一年一度的抢火车票大战正式拉开序幕... 然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现一票难求!想回趟家真难! 那么作为程序猿的你,当然要用程序猿的方式来抢票!下面介绍几 ...

  7. 微信抢抢票服务器,2018微信上怎么老是正在抢票?在微信上抢火车票的经验

    2018微信上怎么老是正在抢票?在微信上抢火车票的经验 马上就是新年啦!春运也已经开始啦!现在怎样抢火车票已经是我们在外游子的难题了!每年一快到春节,回家的火车票就很难抢,现在我们在微信上已经可以抢火 ...

  8. 怎么取消微信送票服务器,微信抢火车票怎么取消?有什么要注意的吗?

    很多人在用微信抢购火车票的时候,订购成功后,不知道订单应该怎么取消,其实这个操作也比较简单,下面就会讲到这个问题,如果大家想要继续了解,就一起来看小编整理的内容吧!希望对您有帮助哦. 要取消在微信上买 ...

  9. mac电脑如何抢火车票

    作为一名iOS开发人员,标配就是一台mac,mac电脑虽然高端大气上档次,但是面对过年回家,却变成了low货,因为mac没有对应的抢票软件,这点让mac用户很是头疼,难道就没有办法解决吗.当然不是,下 ...

最新文章

  1. Delphi异常处理总结
  2. bpnn matlab工具箱,bpnn——matlab工具箱-归一化函数 premnmx、tramnmx、postmnmx、mapminmax...
  3. Java Class 文件格式及其简单 Hack
  4. 网站建设技术――智能建站系统
  5. PTA浙大版python程序设计题目集--第1章-3 输出“Python语言简单易学” (10 分)
  6. 十一、案例:TabBar的封装
  7. Swing中的并发-使用SwingWorker线程模式
  8. 汇编指令push,mov,call,pop,leave,ret建立与释放栈的过程
  9. SCPPO(二十):系统统一身份认证的改造之路
  10. 卸载 Navicat!事实已证明,正版客户端,它更牛逼……
  11. 如何测试WiFi路由器小包性能
  12. 【MVO TSP】基于matlab灰狼算法求解旅行商问题【含Matlab源码 1327期】
  13. CF1375G Tree Modification
  14. Android DataBinding学习和实践(二)
  15. 统计给定的n个数中,负数、零和正数的个数。
  16. Android Service组件实现后台音乐播放
  17. 基于用户画像的PythonDjango框架的电影推荐系统设计与实现
  18. Office2007版本详情
  19. 解决报错ImportError: unique_cuda.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe28T
  20. java 获取当前时间的三种方法

热门文章

  1. oracle 抽样_深入理解Oracle动态采样
  2. hashmap为什么线程不安全_什么时候线程不安全?怎样做到线程安全?怎么扩展线程安全的类?...
  3. 一张图片教你识别Vue的premission的权限管理,您细品\(^o^)/~
  4. 测者的测试技术手册:揭开java method的一个秘密--巨型函数
  5. 线程的基本协作和生产者消费者
  6. HDU 6029(思维)
  7. 关于在ubuntu下配置AMD显卡驱动的总结
  8. 5 结构型模式之 - 适配器模式
  9. EasyUI加载外部页面需要使用html片段
  10. 转:VC9(VC2008.net) 编译安装 boost 1.39 库