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实现随机梯度下降(SGD)
Mar 24 Python
Python 实现选择排序的算法步骤
Apr 22 Python
Sanic框架应用部署方法详解
Jul 18 Python
django 将model转换为字典的方法示例
Oct 16 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
python双向链表原理与实现方法详解
Dec 03 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
aws 通过boto3 python脚本打pach的实现方法
May 10 Python
python安装和pycharm环境搭建设置方法
May 27 Python
python搜索算法原理及实例讲解
Nov 18 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
利用Python实现Picgo图床工具
Nov 23 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中的时间处理
2006/10/09 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
2015/05/25 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
2014/10/16 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
python实现中文转换url编码的方法
2016/06/14 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
python3 flask实现文件上传功能
2020/03/20 Python
深入了解python列表(LIST)
2020/06/08 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
史泰博(Staples)中国官方网站:办公用品一站式采购
2016/09/05 全球购物
比较基础的php面试题及答案-填空题
2014/04/26 面试题
木马的传播途径主要有哪些
2016/04/08 面试题
企业人事任命书
2014/06/05 职场文书
博士生求职信
2014/07/06 职场文书
小学生运动会报道稿
2014/09/12 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
毕业证明模板
2015/06/19 职场文书
公司职员入党自传书
2015/06/26 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript