python+splinter实现12306网站刷票并自动购票流程


Posted in Python onSeptember 25, 2018

通过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 相关文章推荐
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
Jun 11 Python
Python Grid使用和布局详解
Jun 30 Python
Python通用循环的构造方法实例分析
Dec 19 Python
Python从函数参数类型引出元组实例分析
May 28 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
python动态进度条的实现代码
Jul 03 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
python字典和json.dumps()的遇到的坑分析
Mar 11 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
python 爬虫请求模块requests详解
Dec 04 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 Python
python神经网络编程之手写数字识别
May 08 Python
基于Python3.6+splinter实现自动抢火车票
Sep 25 #Python
Python做智能家居温湿度报警系统
Sep 25 #Python
python+splinter自动刷新抢票功能
Sep 25 #Python
python+Splinter实现12306抢票功能
Sep 25 #Python
一百多行python代码实现抢票助手
Sep 25 #Python
python爬虫之自动登录与验证码识别
Jun 15 #Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 #Python
You might like
php引用返回与取消引用的详解
2013/06/08 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
extjs 为某个事件设置拦截器
2010/01/15 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
jquery移动节点实例
2015/01/14 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
python多线程之事件Event的使用详解
2018/04/27 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
正隆泰信息技术有限公司上机题
2012/06/14 面试题
给医务人员表扬信
2014/01/12 职场文书
质检部经理岗位职责
2014/02/19 职场文书
python实现图片批量压缩
2021/04/24 Python
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS