python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程
通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码)。
此类程序只是提高了12306网站的 <查询> 刷新频率(默认自动查询的刷新频率为5秒)。对于学习splinter感觉还是不错的,但是想通过装个类似刷票程序成功购票的 还是多花点钱升级升级硬件设备,提高提高网速吧。
程序写的有点乱,随时修改ing。
#!/usr/bin/env python3
# encoding: utf-8
from splinter.browser import browser
import time
#12306的账号,密码
user_name = 'xxxxxxxxxx' #自行修改
pass_word = 'xxxxxxxxxx'
# 通过splinter,登录12306网站(登录验证码需要手动验证)
b = browser(driver_name = 'firefox') # 设置火狐浏览器
b.visit('https://kyfw.12306.cn/otn/leftticket/init') # 打开12306界面
b.find_by_id(u'login_user') # 点击登录按钮
b.fill('loginuserdto.user_name',user_name) # 填写账号
b.fill('userdto.password',pass_word) # 填写密码
# 手动填写验证码并登录,登录成功后等待自动跳转到购票页面。
'''
跳转页面过程中:
程序可能会报错:[winerror 10053] 您的主机中的软件中止了一个已建立的连接。
原因:未知
解决办法:写一个循环,程序不停的尝试链接跳转页面(总会成功),成功后跳出循环。
'''
while true:
if b.url == 'https://kyfw.12306.cn/otn/index/initmy12306': # 判断是否登录成功
try:
b.visit('https://kyfw.12306.cn/otn/leftticket/init') # 访问购票页面
except connectionabortederror: #捕捉可能出现的异常,继续访问
b.visit('https://kyfw.12306.cn/otn/leftticket/init')
if b.url == 'https://kyfw.12306.cn/otn/leftticket/init': # 判断是否跳转购票页面成功
break
# 添加、加载cookies信息,查询余票。(自动添加出发地、目的地、日期,例如:北京-郑州)
b.cookies.add({'_jc_save_fromdate':'2018-08-11'}) # 出发日期
b.cookies.add({'_jc_save_fromstation':u'%u5317%u4eac%2cbjp'}) # 出发站信息(北京)
b.cookies.add({'_jc_save_todate':'2018-08-11'}) # 到达日期
b.cookies.add({'_jc_save_tostation':u'%u90d1%u5dde%2czzf'}) # 目的地信息(郑州)
b.reload() # 重新加载cookies
b.find_by_text(u'查询').click() #点击查询
# 添加车次类型
l = ['gc-高铁/城际','d-动车','z-直达','t-特快','k-快速','其他']#在列表里可以去掉不需要的车次类型
for i in l:
btn = b.find_by_text(i)
btn.click()
# 下拉订票帮手(此步骤可跳过)
b.find_by_id(u'show_more').click()
# 设置坐席
def the_seat():
'''
添加坐席后,网站会自动勾选<自动提交>、<自动查询>功能。
<自动查询> 默认的是5秒刷新一次(慢),所以我们要关闭此选项,提高刷新频率。
'''
seat =['二等座','软卧','硬卧','硬座','无座'] #设置一个坐席列表
b.find_by_xpath('/html/body/div[6]/div[5]/div[2]/div[7]/div[2]/span/a').click()#打开坐席选择的菜单窗口
for i in seat:
b.find_by_name(i).click() #添加坐席
b.find_by_xpath('/html/body/div[11]/div[1]/a').click()#关闭弹窗
b.find_by_text(u'开启自动查询').click()# 点击关闭<自动查询>选项(慢)。关闭自动查询功能后,自动提交功能也会关闭。
# 购票
def train_ticket_purchase():
the_seat() #设置坐席
b.find_by_id(u'show_more').click() # 关闭订票帮手(此步骤可跳过)
#查询订票
while b.url != 'https://kyfw.12306.cn/otn/confirmpassenger/initdc': #以预订成功跳转页面为判断条件
try:
b.find_by_text(u'查询').click() # 点击查询
if b.is_element_present_by_text(u'预订') == true: #判断是否有<预订>
for i in b.find_by_text(u'预订'): # b.fin_by_text(u'预订'),返回包含<预订>元素的列表,其中有些可以点击‘预订'购票,有些‘预订'显灰色无票状态,无法点击预订购票的。
if i.has_class('btn72'): #筛选<预订>元素,区分可以点击预订的和不可以点击的(可以点击<预订>的元素,都包含属性class('btn72'))
i.click()#点击预订购票
if b.is_element_present_by_xpath('//*[@id="content_defaultwarningalert_hearder"]') == true: #可能会弹窗提示:当前时间不可预订
b.find_by_xpath('//*[@id="gb_closedefaultwarningwindowdialog_id"]').click() # 关闭提示弹窗
print('当前时间不可预订,请关闭程序稍后再运行。')
break
if b.is_element_present_by_xpath('//*[@id="content_defaultwarningalert_title"]') == true: #可能会弹窗提示:您选择的列车距开车时间很近了,请确保有足够的时间抵达车站,并办理换取纸质车票、安全检查、实名制验证及检票等手续,以免耽误您的旅行。
b.find_by_xpath('//*[@id="qd_closedefaultwarningwindowdialog_id"]').click() #关闭弹窗(注意:关闭弹窗,但是仍然会购票)
b.find_by_text(u'xxx')[1].click() #自行添加乘车人名字(注意:登录账号本人的名字元素可能会有两个(一个账号,一个乘车人),注意区分开)
b.find_by_text(u'提交订单').click()
#确认订单(不知道为什么 b.find_by_xpath()方法不行。。。。)
b.find_by_css('html body#body_id.dhtmlx_winviewport.dhtmlx_skin_dhx_terrace div.dhtmlx_window_active div.dhtmlx_wins_body_outer div.dhtmlx_wins_body_inner.dhtmlx_wins_no_header div div#checkticketinfo_id div#content_checkticketinfo_id.up-box.w664 div.up-box-bd.ticket-check div#confirmdiv.lay-btn a#qr_submit_id.btn92s').click()
print('预订成功,退出程序')
break
else:
print('暂时没票,继续查询中...')
else:
print('暂时没票,继续查询中...')
except:
print('不可预订,请稍后再次运行程序...')
break
if __name__ == '__main__':
train_ticket_purchase()
python+splinter实现12306网站刷票并自动购票流程的更多相关文章
- python爬虫之12306网站--火车票信息查询
python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...
- python爬虫之12306网站--车站信息查询
python爬虫查询车站信息 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息进行处理 python爬虫查询全拼相同的车站 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息 ...
- c# 模拟 网页实现12306登陆、自动刷票、自动抢票完全篇
这一篇文章,我将从头到尾教大家使用c#模拟网页面登陆12306网站,自动刷票,选择订票人,到最后一步提交订单.研究过HTTP协议的童鞋们都知道,我们在访问网站时,是有两种方式的,POST和GET方式, ...
- [转载]python实现带验证码网站的自动登陆
原文地址:python实现带验证码网站的自动登陆作者:TERRY-V 早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番 ...
- Python Locust对指定网站“一键压测”
[本文出自天外归云的博客园] 前篇 前篇:Python Locust性能测试框架实践 本篇 承上——归纳过程 在前篇的基础上,我们可以利用Locust性能测试框架编写python脚本对指定网站或者接口 ...
- 4、python+selenium实现12306模拟登录
简介: 这里是利用了selenium+图片识别验证,来实现12306的模拟登录,中间也参考了好几个项目,实现了这个小demo,中间也遇到了很多的坑,主要难点在于图片识别和滑动验证这两个方面,图片识别是 ...
- Python之路,Day22 - 网站用户访问质量分析监测分析项目开发
Python之路,Day22 - 网站用户访问质量分析监测分析项目开发 做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129 项目实战之 ...
- 探索 Windows Azure 网站中的自动伸缩功能
去年10月,我们发布了若干针对 WindowsAzure平台的更新,其中一项更新是添加了基于日期的自动伸缩调度支持(在不同的日期设置不同的规则). 在这篇博客文章中,我们将了解自动伸缩的概念,并 ...
- 假如我来架构12306网站---文章来自csdn(Jackxin Xu IT技术专栏)
(一)概论 序言: 此文的撰写始于国庆期间,当中由于工作过于繁忙而不断终止撰写,最近在设计另一个电商平台时再次萌发了完善此文并且发布此文的想法,期望自己的绵薄之力能够给予各位同行一些火花,共同推进国 ...
随机推荐
- SQL基础E-R图画法
例一.假设有以下表:T1(a1,a2, a3, a5)T2(a3,a4)T3(a5, a6)T4(a3, a5, a7)其中带下划线的属性标识为所在关系模式的主码T1中的a3是参照T2的外码T1中的a ...
- 如何使用google等一系列搜索引擎?
对于我们经常使用的搜索引擎大家都都不陌生,但是,如何高效的利用呢?大家都知道空格是搜索多个关键词,那么有没有其他的快捷键呢?答案是肯定的,以下内容转自知乎 1.双引号 把搜索词放在双引号中,代表完全匹 ...
- Codeforces 1077(F1+F2) DP 单调队列
题意:给你一个n个元素的数组,从中选取x个元素,并且要保证任意的m个位置中必须至少有一个元素被选中,问选中元素的和最大可以是多少? F1 n,m,x到200 F2 n,m,x到5000. 思路1:设d ...
- go get
go get 命令用于从远程代码仓库(比如 Github )上下载并安装代码包.注意,go get 命令会把当前的代码包下载到 $GOPATH 中的第一个工作区的 src 目录中,并安装. 如果在 g ...
- PythonNote02_HTML标签
<!DOCTYPE> <html> <head> <meta charset = "utf-8" /> <meta name= ...
- Tensorflow fetch和feed
import tensorflow as tf #Fetch input1 = tf.constant(1.0)input2 = tf.constant(3.0)input3 = tf.constan ...
- 算法Sedgewick第四版-第1章基础-1.4 Analysis of Algorithms-006BitonicMax
package algorithms.analysis14; import algorithms.util.StdOut; import algorithms.util.StdRandom; /*** ...
- java中什么是代码点,什么是代码单元?
1.代码点&代码单元,是从Unicode标准而来的术语,Unicode标准的核心是一个编码字符集,它为每一个字符分配一个唯一数字.Unicode标准始终使用16进制数字,并且在书写时在前面加上 ...
- Java50道经典习题-程序47 输入数字打印星号
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*. import java.util.Scanner; public class Prog47{ public static ...
- C#:数据库通用访问类 SqlHelper
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; usin ...