通过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自动购买12306票_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. python12306下单步骤_python+splinter实现12306网站刷票并自动购票流程

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

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

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

  5. python查询12306余票_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  6. python实战扫码下载_Python实例 一 12306抢票(一)扫码登陆

    一.登陆 采用扫码二维码的方式登陆,就是得下个app..  验证码太烦了,不想搞 1.获取二维码: 先分析二维码一般是一张图片,我们把他下载到本地 来方便扫码 图片还是base64的数据形式 但是我们 ...

  7. python模拟app抢票_python并发编程多进程 模拟抢票实现过程

    抢票是并发执行 多个进程可以访问同一个文件 多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务 db.txt {"count": 1} 并发运行,效率高 ...

  8. python作业火车票订购系统_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都具体给共享出来.(注重使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  9. python博客项目评论_Python 爬虫入门——小项目实战(自动私信博客园某篇博客下的评论人,随机发送一条笑话,完整代码在博文最后)...

    之前写的都是针对爬虫过程中遇到问题的解决方案,没怎么涉及到实际案例.这次,就以博客园为主题,写一个自动私信博客下的评论人员(在本篇留下的评论的同学也会被自动私信,如果不想被私信,同时又有问题,请私信我 ...

  10. python 12306登录_python爬虫--模拟12306登录

    模拟12306登录 超级鹰: #!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Ch ...

最新文章

  1. 为什么 StackOverflow 上的代码片段会摧毁你的项目?
  2. what is the thinking routine of the open source?
  3. pandas DataFrame 数据处理常用操作
  4. 使用ImpromptuInterface反射方便的创建自定义DfaGraphWriter
  5. 百度AI学习-错误类型大全
  6. springboot线程池使用
  7. 怎样填充潘通颜色_怎样判定润滑脂,锂基脂的好坏?
  8. 2年python自动化编程自学经历,分享一些学习心得和避坑经验
  9. Video.js - HTML5 视频播放器
  10. java8中的闭包Function/BiFunction
  11. Redis 列表(List) Redis Lpush 命令
  12. 计算机毕设 SpringBoot 校园志愿者管理系统 志愿者管理系统 志愿者信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  13. 故障排查——CPU使用率过高
  14. 电脑系统安装后桌面图标隔开很宽怎么调?
  15. 1.《阿西莫夫:机器人短篇全集》
  16. 十二经纳干支歌,十二经纳地支歌
  17. 2018最新4K Ultra HD/UHD视频剪辑/特效合成/调色图形工作站硬件配置
  18. Linux学习日志-02
  19. 一刀传世服务器维护,#一刀传世#
  20. ClassLayout ,JOL Maven地址及锁64位状态图

热门文章

  1. 解决Vue项目: verbose stack Error: unable to resolve dependency tree
  2. 苹果手机(IOS)蓝牙相关知识【配对后蓝牙设置界面i标识】【连接参数的限制】[只以地址作为识别依据]
  3. 十大最佳外国Android游戏下载平台
  4. python数列_Python斐波拉契数列
  5. 微微一笑很倾城(2)
  6. CTR预估:计算广告的应用(1)——理论
  7. django ajax jquery csrf_exempt 设置favicon.ico
  8. 大学毕业4年-回顾和总结(3)-投资理财观-图穷而真相现
  9. 操作系统重要知识清单:操作系统的运行机制与体系结构
  10. iOS软键盘弹出后视图向上移动