抢火车票这个事吧,其实我也能做!(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;抖音能够检测到图像中所包含人体的…

PHP获取中文字符拼音首字母

在项目中遇到需要把游戏进行字母排序&#xff0c;于是百度到一个格式化的首字母的方法。 /*** name php获取中文字符拼音首字母* param $str* return null|string*/public function getFirstCharter($str){if (empty($str)) {return ;}$fchar ord($str{0});if ($fchar > or…

Array类型

一、转换方法 toString() 调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串 valueOf() 返回的还是数组 实际上&#xff0c;为了创建这个字符串会调用数组每一项的toString()方法 二、栈方法 push() pop() 只发生在栈的顶部 三…

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…

MYSQL和JAVA(课堂笔记)

MYSQL  数据库管理工具 JAVA    编程语言 数据库驱动&#xff08;JAVA和MYSQL对接方式&#xff09; 到官网上下载驱动    加载驱动 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class S…

解密昇腾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;在店铺管理--商品售卖时段里配置售卖时间以及相应时段售卖的商…

使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling

[问题]使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling [原因] 这是因为 Python 包的版本问题&#xff0c;例如安装了较旧版本的 Numpy&#xff0c;但安装了较新版本的 Pandas。 [解决方法] 查看Numpy版本号 python -c "import numpy; prin…

『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)

# 『Python基础-12』各种推导式&#xff08;列表推导式、字典推导式、集合推导式&#xff09; 推导式comprehensions&#xff08;又称解析式&#xff09;&#xff0c;是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导&#x…

海思芯片选型表汇总

海思芯片选型表汇总_「违规用户」的博客-CSDN博客_海思芯片型号大全

Docker中未指定挂载点容器间volume卷的数据共享

一 背景 在实际使用过程中&#xff0c;我们可能会经常遇到容器间数据共享的情况&#xff0c;怎么处理呢&#xff1f;通过 docker 命令中的一些选项&#xff0c;我们即可完成容器间的数据共享。 二 实验步骤 2.1 创建容器 容器一&#xff1a;gysl-1 [rootdev ~]# docker run -it…

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

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

js把日期字符串转换成时间戳

//获取当前时间&#xff1a; var myDate new Date();//当前时间 var year myDate.getFullYear();//当前年份 var month myDate.getMonth() 1;//当前月份 var day myDate.getDate();//当前日 myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); …

VS2008中开发智能设备程序的一些总结

原文链接&#xff1a;http://blog.csdn.net/citybug_nj/article/details/2598705 程序中包括四个部分&#xff1a; 系统配置这个部分用来配置系统中的相关参数&#xff0c;参数包括数据库信息和串口的配置信息。这部分的主要技术是XML文件的读取和写入。 数据下载从数据库中下载…

go语言值得学习的开源项目推荐

谷歌官方维护了一个基于go语言的开源项目列表&#xff1a; https://github.com/golang/go/wiki/Projects 其中有非常多的优秀项目值得学习&#xff0c;有几百行代码适合新手阅读的项目&#xff0c;也有大型如nsq、docker等的项目。 下面推荐几款适合学习的项目&#xff1a; 1、…

部分Nand flash uboot 命令详解

nand info & nand device显示flash的信息&#xff1a; DM365 :>nand info Device 0: NAND 32MiB 3,3V 8-bit, sector size 16 KiB DM365 :>nand device Device 0: NAND 32MiB 3,3V 8-bitnand read(.oob) addr off size 不管是读取data, 使用nand read&#xff0c;还是…

java7

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

BZOJ 3564 信号增幅仪

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3564 题意&#xff1a;给出平面上n个点&#xff0c;画出一个椭圆&#xff0c;椭圆的长轴是短轴的p倍&#xff0c;且长轴的方向为x轴逆时针旋转a度。求这个椭圆短轴的最小值使得可以覆盖所以点。 思路&…

CentOS 7 搭建JAVA环境

安装环境&#xff1a; LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.3.1611 (Core) Release: 7.3.1611 Codename: Core 开始 运行java -version 检查系统是否安装JRE 或JDK&#xff0c;有则卸载系统自带JAVA包输…

串口波形分析

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