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

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

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

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

来来来,直接入正题吧! 这里有两种方案,一种是基于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的查票页面,然后打开浏览器的开发者模式,输入对应的城市,然后查看请求信息。

image.png

四、登录功能实现

登录我们需要手动登录,扫码或者输入账号都可以。登录后记录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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Python+openpose 实现抖音尬舞机

游戏开始后&#xff0c;随着音乐会给出不同的动作提示&#xff0c;用户按照提示摆出正确动作即可得分。援引官方说法&#xff0c;“尬舞机”主要应用了今日头条 AI Lab 自主开发的“人体关键点检测技术”&#xff0c;依靠这项技术&#xff0c;抖音能够检测到图像中所包含人体的…

Create a Service Catalog Request via REST API

http://wiki.servicenow.com/index.php?titleUseful_Catalog_Scripts#Eureka http://wiki.servicenow.com/index.php?titleService_Catalog_Script_API#gsc.tab0 Service Catalog APIhttps://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/integrate/inboun…

解密昇腾AI处理器--Ascend310简介

Ascend310 AI处理器规格 Ascend310 AI处理器逻辑架构 昇腾AI处理器本质上是一个片上系统&#xff08;System on Chip&#xff0c;SoC&#xff09;&#xff0c;主要可以应用在和图像、视频、语音、文字处理相关的应用场景。其主要的架构组成部件包括特制的计算单元、大容量的存储…

银盒子扫码下单在线订单开启商品售卖时段使用说明

1&#xff0c;登陆管理员账号&#xff0c;子账号下&#xff0c;配置管理--店铺配置--扫码下单Tab页&#xff0c;是否开启商品售卖时段&#xff0c;选择“是” 2&#xff0c;在商家后台登陆相应的子账号&#xff0c;在店铺管理--商品售卖时段里配置售卖时间以及相应时段售卖的商…

为什么早上和傍晚的太阳总是红色,而中午的大阳却是黄白色?

由太阳光本质决定&#xff0c;但会受环境影响。在地球上和火星上看到的太阳光也是有区别的&#xff0c;和太气层物质及厚薄也有关系。太阳光是由赤橙黄绿青蓝紫七色光组成的复合光是白色光。 在日出和日落的时候&#xff0c;地平线上所透过的大气层厚度&#xff0c;一般要比白…

java7

第八章 数组 1.数组的声明定义 数据类型[]变量名 new 数据类型[长度]; 列&#xff1a;int[]ary new int[5]; 2.取值&#xff0c;赋值 取值&#xff1a;数据名[下标]; 列&#xff1a;int a ary[1]; 赋值&#xff1a;变量数据名[…

串口波形分析

UART口发出数据按字节发送&#xff0c;发送数据8bit&#xff0c;实际量出波形为10bit&#xff0c;软件底层驱动会自动加上起始位和停止位各1bit&#xff0c;起始位为0&#xff0c;停止位为1。下图为用串口工具发送的数据和用示波器所量波形。 发送数据&#xff1a;0x34 0x43 示…

SpringBoot之MongoTemplate的查询可以怎么耍

学习一个新的数据库&#xff0c;一般怎么下手呢&#xff1f;基本的CURD没跑了&#xff0c;当可以熟练的增、删、改、查一个数据库时&#xff0c;可以说对这个数据库算是入门了&#xff0c;如果需要更进一步的话&#xff0c;就需要了解下数据库的特性&#xff0c;比如索引、事物…

LINQ to SQL 实现 GROUP BY、聚合、ORDER BY

前言 本示例主要实现 LINQ 查询&#xff0c;先分组&#xff0c;再聚合&#xff0c;最后在排序。示例很简单&#xff0c;但是使用 LINQ 却生成了不同的 SQL 实现。 1) 采用手动编写 SQL 实现 SELECT ROW_NUMBER() OVER(ORDER BY T.RealTotal DESC) AS SN, * FROM ( SELECT (S…

虚拟机增加内存方法

楼主由于要在虚拟机里面装一个oracle&#xff0c;在安装过程中&#xff0c;提示物理内存不符合最低标准&#xff0c;如图1. 图1 因为懒得新建一个虚拟机了&#xff0c;所以考虑给虚拟机新增磁盘空间。 首先说明&#xff0c;新增磁盘空间&#xff0c;必须保证当前虚拟机里每个新…

面对对象-封装

private 私有的 package/friendly/default 不写 protected 受保护的 public 公共的 那么什么情况该用什么修饰符呢&#xff1f;从作用域来看&#xff0c;public能够适用所有的情况。 但是大家在工作的时候&#xff0c;又不会真正全部都适用public,那么到底什么情况改用什么修饰…

本文详解5G是个什么鬼,程序员都准备好了吗?

无线移动通讯发展历史 最近5G的概念炒的如火如荼&#xff0c;为此&#xff0c;华为和高通还干了一仗。这篇文章从技术层面给大家分析&#xff0c;什么是5G&#xff0c;它和4G比&#xff0c;高级在哪里&#xff1f; 我们来看看移动互联网的技术发展&#xff1a; 然后我们在来看看…

Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...

Istio Gateway提供多个自定义入口网关的支持能力&#xff0c;通过开放一系列端口用于承载网格边缘的进入连接&#xff0c;同时可以使用不同loadbalancer来隔离不同的入口流量。cert-manager可用于使用存储在Kubernetes Secret资源中的任意签名密钥对来获取证书。本文提供了手动…

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)

3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我们的小朋友很喜欢计算机科学&#xff0c;而且尤其喜欢二叉树。考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n]。…

子序列进阶问题

题目&#xff1a; 有一个数组&#xff0c;让找到两个不重复的连续子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定连续&#xff0c;设两端连接处index为{X&#xff0c;x1}&#xff0c;X可取0~n-1 设F(x)为连接处index为{X&#xff0c;x1}时 Max(Sum(A)…

day5-shelve模块

一、概述前面章节我们讲述了json和pickle模块的序列化和反序列化处理&#xff0c;他们有一个不足是在python 3中不能多次dump和load&#xff0c;shelve模块则可以规避这个问题。shelve模块是一个简单的k,v将内存数据通过文件持久化的模块&#xff0c;可以持久化任何pickle可支持…

程序员:请你不要对业务「置之不理」

成长是条孤独的路&#xff0c;一个人会走得更快&#xff1b;有志同道合者同行&#xff0c;会走得更远。本篇内容整理自 21 天鲲鹏新青年计划线上分享内容。鲲鹏新青年计划是由 TGO 鲲鹏会组织的线上分享活动&#xff0c;希望能帮助更多同学一起学习、成长。12 月 28 日&#xf…

在Ubuntu系统下如何将chrome浏览器的bookmarks导出到本地

1. 打开chrome浏览器在页面的右上角点击那个三个小点的位置&#xff0c;找到bookmarks&#xff0c;然后点击bookmarks manager,然后在organize右侧大倒三角下选择&#xff0c;export bookmarks to HTML&#xff0c;选择要保存的位置&#xff0c;利用同样的方法下次就可以直接导…

028 -bash-4.1$ 出现故障的原理及解决办法?

最近在搭建分布式的时候&#xff0c;出现了这个问题&#xff0c;很不爽。下面是我的解决方式。 1.在用户下删除bash rm -rf /home/beifeng/.bash* 2.拷贝 cp /etc/skel/.bash* /home/beifeng 3.退出&#xff0c;再进入用户 4.解释 set |grep -i ps1 转载于:https://www.cnblogs…

李彦宏千字愿景内部信:10次提到“用户”

中新网1月17日电 1月17日&#xff0c;百度公司创始人、董事长兼CEO李彦宏发出一封内部信&#xff0c;信中&#xff0c;李彦宏向员工阐述了百度愿景&#xff1a;成为最懂用户&#xff0c;并能帮助人们成长的全球顶级高科技公司。他提出&#xff0c;百度要持续创新&#xff0c;“…