通过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网站刷票并自动购票流程

本文地址: http://www.cppcns.com/jiaoben/python/240330.html

python12306下单步骤_python+splinter实现12306网站刷票并自动购票流程相关推荐

  1. python批量自动订票_python+splinter实现12306网站刷票并自动购票流程

    python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...

  2. python12306刷票脚本_python+splinter实现12306网站刷票并自动购票流程

    通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinte ...

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

    python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...

  4. python12306下单步骤_python编程实现12306的一个小爬虫实例

    本文思路主要来源于实验楼的教程,但是一些具体的一些细节是我自己发现的,比如哪里获得站点对应的3位英文编号,怎么获得这个查询的url 本文用到的库主要有requests(获取url的内容),pretty ...

  5. python12306下单步骤_Python 12306完整使用方式

    1.项目下载 首先介绍一下python 12306的项目,这个项目gitup的一个抢票开源项目,并且在gitup中排行最高,使用最多.打开百度,所有gitup,进入gitup,搜索12306,排名第一 ...

  6. (技术贴)铁道部12306网站瘫痪:网络购票技术之罪

    (技术贴)铁道部12306网站瘫痪:网络购票技术之罪 ·      正文 ·      我来说两句(0人参与) 2012年01月06日03:50 来源:21世纪网-<21世纪经济报道> 作 ...

  7. 快过年了,Python实现12306查票以及自动购票....

    嗨害大家好鸭!我是小熊猫~ 明天就是2023年啦~ 还有谁像我小熊猫一样没有回家的? 这次康康能不能12306抢票回家!!! Python实现12306查票以及自动购票 [代码来源]: 青灯教育-自游 ...

  8. python抢票web端_python+Splinter实现12306抢票功能

    本文实例为大家分享了python实现12306抢票功能的具体代码,供大家参考,具体内容如下 源码记录如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # ...

  9. python自动购买12306票_Python-12306模拟自动购票!快过年了,学起来啊!

    sleep(1) bro.find_element_by_id('J-password').send_keys(my_passwords) print(u"手动验证---") wh ...

最新文章

  1. LeetCode实战:2的幂
  2. 简单的介绍一下怎样如何学习Java基础
  3. mysql5.7多实例安装_MySQL数据库5.7多实例安装
  4. oracle多表关联查询报表,oracle多表关联查询和子查询
  5. 使用JDBC操作基于Oracle的CLOB,BLOB字段类型
  6. layuiadmin上手好难_新手如何快速上手自媒体赚钱?送你4个好建议!记得收藏
  7. ubuntu shell简介
  8. css x轴不滚动_css – 固定div,动态内容不滚动
  9. 2-1:套接字(Socket)编程之必备知识
  10. css3 position: fixed 居中问题,移动端,旁边留白的情况fixed不能居中的问题;
  11. Python可以这样学(第七季:pillow扩展库图像编程)-董付国-专题视频课程
  12. php找不到库,64位系统下编译PHP找不到库文件问题 | 学步园
  13. 20190925 On Java8 第二十二章 枚举
  14. word整个表格首行缩进_word表格怎么首行缩进 word表格内容缩进
  15. linux安装程序时Cannot uninstall XXX. It is a distutils installed project and thus we cannot accurately
  16. 嵌入式技术基础与实践(第4版)
  17. 【Day5.4】高棉风格的柴瓦塔纳兰寺
  18. unity 导入gltf_GLTF相关资料
  19. 佐冶亚理工学院计算机WeiXU博士,讲座通知:佐治亚理工大学张晗博士
  20. 01.ingest pipeline的使用简介

热门文章

  1. SPSS的COM组件创建实例失败
  2. 说说我的新书《MySQL DBA工作笔记》
  3. 文件结束标志EOF及fgetc fgets getc gets getchar函数
  4. java异常throws怎么用,throw_JAVA的throw和throws怎么用!
  5. WINDOWS 系统如何查看 Python的安装版本号
  6. Jetpack Compose动画
  7. 学习OpenCV:频域及傅里叶变换
  8. 最近爆火的恋爱话术小程序是如何运营的
  9. 结合MongoDB开发LBS应用——附近的人
  10. Unity3D学习——(一)让Unity3D中的单位与2D像素对应