上一篇文章,我们简单介绍了一下python splinter的安装。这一次,我们通过python和splinter分析一下12306网站。

这是一个很简单也很有趣的尝试。而且正值春运期间,也许会对您的出行有帮助~

当然本文纯属简单的入门级应用,大神请轻喷。

一、12306网站的情况

下面是2015年改版后的12306网站页面:

点击右侧的新版售票按钮,可以进入到售票查询页面:

不必登录,输入出发地、目的地、出发日即可查询到车票情况。

二、我们的需求

对于火车票,我们最重要的需求就是查看有没有相应时间、相应地点的车票,而且肯定希望不要人工干预的自动查看。简单整理了一下需求的流程:

三、python splinter的程序处理

按照上面分析的需求流程,下面开始逐一分析如何实现python splinter的程序处理。

在python程序的开头,需要导入splinter的库:

from splinter.browser import Browser

好了,从现在开始,后面的程序可以调用splinter的库函数了。splinter的库函数比较丰富,主要是针对浏览器(或浏览器页面控件)的操作。比如,查找某一控件、点击某一控件。各位感兴趣可以在下面的地址详细查阅:

下面进入正题:

1)进入查票页面

首先调起chrome浏览器,后面明确写了使用chrome的浏览器驱动:

b = Browser(driver_name="chrome")下面进入查票页面:

url = "https://kyfw.12306.cn/otn/leftTicket/init"

b.visit(url)

现在可以看到浏览器已经自己打开,并进入到查票页面:

这时候需要人工干预一下,要在出发地和目的地录入地点、时间,然后进行一下查询:

这么做主要是获取一下这个页面的cookies信息:

可以看到有这些cookies信息:

_jc_save_fromDate------出发时间 cookie值:2016-02-06

_jc_save_fromStation------出发地 cookie值:%u5317%u4EAC%2CBJP(北京)

_jc_save_toStation------目的地 cookie值:%u4E0A%u6D77%2CSHH(上海)

下面,可以开始进入下一步操作了。

2)判断是否有票,如果没票则自动刷新页面:

刚才也看到,车票的出发时间、出发地、目的地等信息是藏在页面的cookies信息里,所以如果要查询自动刷新页面,查询特定日期、特定地点的车票,可以模拟插入带有这些信息的cookies值。

b.cookies.add({"_jc_save_fromDate":"2016-02-06"})

b.cookies.add({"_jc_save_fromStation":"%u5317%u4EAC%2CBJP"})

b.cookies.add({"_jc_save_toStation":"%u4E0A%u6D77%2CSHH"})

由于出发地、目的地的cookies值是加密过的,因此如果你想调整目的地信息,那可以像刚才一样先人工查询一下你期望的目的地信息,然后就可以立刻从cookies里找到相应地点的密文了,再粘贴到上面的语句中,以便插入cookies信息。

插入带有相关信息的cookies值后,就可以刷新页面了。用下面的语句。

b.reload()

reload以后就可以看到浏览器页面中填写的出发地、目的地、出发时间变成刚才我们添加的cookies的值了。

下面需要新增一个条件判断及一个循环,达到没票自动刷新查询的目的。

首先是条件判断,这里采用一个比较简单的判断:如果有票肯定有“预订”按钮。

splinter有专门的语句判断是否存在特定组件,我们可以用下面的语句实现对“预订”按钮的检查。

b.is_element_present_by_text(u"预订")

如果有“预订”按钮,则返回true,如果没有返回false。

或是否找不到“预订”按钮。

b.is_element_not_present_by_text(u"预订")如果没有“预订”按钮,则返回true,如果有返回false。

这样就可以以此为条件,编写循环逻辑:

while(b.is_element_not_present_by_text(u"预订")):

b.find_by_text(u"查询").click()

time.sleep(3)

即:如果不存在“预订”按钮,就重新点击查询,如果存在“预订”按钮,则跳出循环,进行下一步操作。为了防止过快刷页面新造成报错,可以增加time.sleep(3),即:在每次点击“查询”后,休息3秒,再进入下一次循环。

下面,如果存在“预订”按钮,怎么处理呢?

这里,需要说明的是,因为有很多车次,所以就会有很多“预订”按钮,因此“预订”按钮的对象,是一个“组”。

这时,要操作特定的“预订”按钮时,必须制定时“组”中的第几个按钮。“组”是从0开始排序的,因此,我们每次先点击序号为“0”的“预订”按钮(排在最前面的“预订”按钮),即:有票的最早的车次。

b.find_by_text(u"预订")[0].click()

这样,这个程序就基本写好了。可以不断刷新页面,并检查是否有当天的火车票,如果有则点击预订。

from splinter.browser import Browser

import time

b = Browser(driver_name="chrome")

url = "https://kyfw.12306.cn/otn/leftTicket/init"

b.visit(url)

raw_input("请直接在页面输入目的地信息和出发时间,点击查询后,按任意键继续: ")

b.cookies.add({"_jc_save_fromDate":"2016-02-09"})

b.cookies.add({"_jc_save_fromStation":"%u5317%u4EAC%2CBJP"})

b.cookies.add({"_jc_save_toStation":"%u4E0A%u6D77%2CSHH"})

b.reload()

while(b.is_element_not_present_by_text(u"预订")):

b.find_by_text(u"查询").click()

time.sleep(3)

b.find_by_text(u"预订")[0].click()

exit();

这只是一个简单的示例,不包括对于验证码的处理。所以在订票的时候还得手工输入验证码。这个示例非常的简单,无法检查特定时间、特定车次、特定舱位(硬座、软座、商务)的车票,只能检查某一天整体的车票情况。如果需要将特定时间、特定车次、特定舱位(硬座、软座、商务)也作为条件进行查询,也是可以的,但是比较复杂,要用到python的json库。这是由于,12306对于查票返回的数据使用了json 格式的数据包:

而在这些json数据包中,可以找到特定时间、特定车次、特定舱位(硬座、软座、商务)是否有票的信息:

而对于python来说,其json库就是专门用来分析json数据包。但过程会相对复杂一些,如果有人感兴趣,后续有机会再开篇文章专题介绍。

python火车票分析_通过python splinter分析12306网站相关推荐

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

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

  2. 自助分析_为什么自助服务分析真的不是一回事

    自助分析 That title probably got your attention and now you think I have some explaining to do! The key ...

  3. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

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

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

  5. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

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

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

  7. python12306下单步骤_python+splinter实现12306网站刷票并自动购票流程

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

  8. 用python进行营销分析_用python进行covid 19分析

    用python进行营销分析 Python is a highly powerful general purpose programming language which can be easily l ...

  9. python分类信息_用Python分析了 7 万款 App后,我们发现...

    原标题:用Python分析了 7 万款 App后,我们发现... 本文中使用 Scrapy 爬取了豌豆荚全网 70,000+ App ,并进行探索性分析. 写在前面:若对数据抓取部分不感兴趣,可以直接 ...

  10. python 数据分析 电信_基于Python的电信客户流失分析和预测

    一.项目背景 电信服务是生活中常见的消费服务,在现代社会,凡是使用手机打电话,或者在家看电视,都必须通过电信运营商提供的通话.网络等服务才能实现.本文采用来自kaggle平台的电信客户数据集,来分析人 ...

最新文章

  1. ZIP,一个没落天才的故事
  2. 调用一次fork返回2次
  3. 吃下去的东西老是往上翻上来_这间日日火爆的面馆,当年海藻带宋思明吃过
  4. 电脑无故弹出yyy102.html网页的解决办法(没办法,今天中招了)
  5. ASP.NET Core在 .NET 5 Preview 7的更新
  6. 框架中建立浮动框架_建立代理,而不是框架
  7. gui界面怎么分页_什么是用户界面和体验设计
  8. Cloud一分钟 | 谷歌关闭社交平台;亚马逊云服务拿下10亿美元订单,劲敌微软败走麦城...
  9. 解决Firefox访问EBS时提示激活Java插件的问题
  10. MySQL-(1)查看用户权限、(2)用户授权、(3)删除用户权限 语法格式总结
  11. 让域控制器强制向DNS服务器注册SRV记录
  12. 《Java语言程序设计》(基础篇原书第10版)第十三章复习题答案
  13. c语言常用图形函数库,easyx安装过程及c语言常用图形库函数全解.ppt
  14. Scratch编程(八)扩展模块:文字朗读模块
  15. 蓝奏批量替换自定义域名php源码
  16. 深度长文:AMD的崛起、衰落与复兴
  17. linux下 不显示光驱,Windows7电脑下不显示光驱盘符的解决方法
  18. JavaScript XHR使用 JSONPlaceholder API 并本地搭建JSON server REST API
  19. js实现获取当前时间是本月第几周和年的第几周的方法
  20. 今日干货|如何自学视频剪辑(自学视频剪辑容易吗)

热门文章

  1. 投影幕布尺寸计算器_投影幕尺寸是怎么算的
  2. SSD固态硬盘和机械硬盘的区别
  3. deepin 切换输入法
  4. 利用吉洪若夫正则化及其西尔韦斯特方程来修复受损图像
  5. [MIT]微积分重点 第四课 指数函数(exponential) 学习笔记
  6. 【es6学习】Babel 转码器详解
  7. python毕业设计项目源码选题(14)校园失物招领系统毕业设计毕设作品开题报告开题答辩PPT
  8. POC_Jenkins
  9. canvas节点无法导出图片_HTML转为PDF,图片导出失败的终极解决方案
  10. AWS 云计算 SQS SNS