python火车票分析_通过python splinter分析12306网站
上一篇文章,我们简单介绍了一下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网站相关推荐
- python批量自动订票_python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...
- 自助分析_为什么自助服务分析真的不是一回事
自助分析 That title probably got your attention and now you think I have some explaining to do! The key ...
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- python12306刷票脚本_python+splinter实现12306网站刷票并自动购票流程
通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinte ...
- python12306下单步骤_python+splinter实现12306网站刷票并自动购票流程
通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinte ...
- 用python进行营销分析_用python进行covid 19分析
用python进行营销分析 Python is a highly powerful general purpose programming language which can be easily l ...
- python分类信息_用Python分析了 7 万款 App后,我们发现...
原标题:用Python分析了 7 万款 App后,我们发现... 本文中使用 Scrapy 爬取了豌豆荚全网 70,000+ App ,并进行探索性分析. 写在前面:若对数据抓取部分不感兴趣,可以直接 ...
- python 数据分析 电信_基于Python的电信客户流失分析和预测
一.项目背景 电信服务是生活中常见的消费服务,在现代社会,凡是使用手机打电话,或者在家看电视,都必须通过电信运营商提供的通话.网络等服务才能实现.本文采用来自kaggle平台的电信客户数据集,来分析人 ...
最新文章
- ZIP,一个没落天才的故事
- 调用一次fork返回2次
- 吃下去的东西老是往上翻上来_这间日日火爆的面馆,当年海藻带宋思明吃过
- 电脑无故弹出yyy102.html网页的解决办法(没办法,今天中招了)
- ASP.NET Core在 .NET 5 Preview 7的更新
- 框架中建立浮动框架_建立代理,而不是框架
- gui界面怎么分页_什么是用户界面和体验设计
- Cloud一分钟 | 谷歌关闭社交平台;亚马逊云服务拿下10亿美元订单,劲敌微软败走麦城...
- 解决Firefox访问EBS时提示激活Java插件的问题
- MySQL-(1)查看用户权限、(2)用户授权、(3)删除用户权限 语法格式总结
- 让域控制器强制向DNS服务器注册SRV记录
- 《Java语言程序设计》(基础篇原书第10版)第十三章复习题答案
- c语言常用图形函数库,easyx安装过程及c语言常用图形库函数全解.ppt
- Scratch编程(八)扩展模块:文字朗读模块
- 蓝奏批量替换自定义域名php源码
- 深度长文:AMD的崛起、衰落与复兴
- linux下 不显示光驱,Windows7电脑下不显示光驱盘符的解决方法
- JavaScript XHR使用 JSONPlaceholder API 并本地搭建JSON server REST API
- js实现获取当前时间是本月第几周和年的第几周的方法
- 今日干货|如何自学视频剪辑(自学视频剪辑容易吗)