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内置函数之filter map reduce介绍
Nov 30 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
python实现杨氏矩阵查找
Mar 02 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
Python安装selenium包详细过程
Jul 23 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
python 如何读、写、解析CSV文件
Mar 03 Python
Python基础之hashlib模块详解
May 06 Python
python中的None与NULL用法说明
May 25 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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获取当前时间的毫秒数的方法
2014/01/26 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
用 JSON 处理缓存
2007/04/27 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
Python装饰器用法实例总结
2018/05/26 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
《油菜花开了》教学反思
2014/02/22 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
大明湖导游词
2015/02/03 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP