Python脚本实现12306火车票查询系统_python

最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来。(注意使用的是python3)

首先我将最终结果给展示出来:

在cmd命令行执行:python tickets.py -dk shanghai chengdu 20161007 > result.txt

意思是:查询 上海--成都 2016.10.07 的D和K开头的列车信息,并保存到 result.txt文件中;下面就是result.txt文件中的结果:

下面的将是实现步骤:

1、安装第三方库 pip install 安装:requests,docopt,prettytable

2、docopt可以用来解析从命令行中输入的参数:

"""
Usage:
test [-gdtkz] <from> <to> <date>
Options:
-h,--help 显示帮助菜单
-g 高铁
-d 动车
-t 特快
-k 快速
-z 直达
Example:
tickets -gdt beijing shanghai 2016-08-25
"""
import docopt
args = docopt.docopt(__doc__)
print(args)
# 上面 """ """ 包含中的:
#Usage:
# test [-gdtkz] <from> <to> <date>
#是必须要的 test 是可以随便写的,不影响解析

最终打印的结果是一个字典,方便后面使用:

3、获取列车的信息

我们在12306的余票查询的接口:

url:https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2016-10-05&from_station=CDW&to_station=SHH

方法为:get

传输的参数:queryDate:2016-10-05、from_station:CDW、to_station:SHH

其中城市对应简称是需要另外的接口查询得出

3.1 查询城市对应的简称:

这个接口的url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8968'

  方法是get,对返回结果利用正则表达式,取出城市名和简称的值(返回的值类似:7@cqn|重庆南|CRW|chongqingnan|cqn|,我们需要的就是:CRW、chongqingnan),代码如下

parse_stations.py:

#coding=utf-8
from prettytable import PrettyTable
class TrainCollection(object):
"""
解析列车信息
"""
# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座
header = '序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座'.split()
def __init__(self,rows,traintypes):
self.rows = rows
self.traintypes = traintypes
def _get_duration(self,row):
"""
获取车次运行的时间
"""
duration = row.get('lishi').replace(':','小时') + '分'
if duration.startswith('00'):
return duration[4:]
elif duration.startswith('0'):
return duration[1:]
return duration
@property
def trains(self):
result = []
flag = 0
for row in self.rows:
if row['station_train_code'][0] in self.traintypes:
flag += 1
train = [
# 序号
flag,
# 车次
row['station_train_code'],
# 出发、到达站点
'/'.join([row['from_station_name'],row['to_station_name']]),
# 成功、到达时间
'/'.join([row['start_time'],row['arrive_time']]),
# duration 时间
self._get_duration(row),
# 商务座
row['swz_num'],
# 一等座
row['zy_num'],
# 二等座
row['ze_num'],
# 软卧
row['rw_num'],
# 硬卧
row['yw_num'],
# 硬座
row['yz_num'],
# 无座
row['wz_num']
]
result.append(train)
return result
def print_pretty(self):
"""打印列车信息"""
pt = PrettyTable()
pt._set_field_names(self.header)
for train in self.trains:
pt.add_row(train)
print(pt)
if __name__ == '__main__':
t = TrainCollection()

其中pprint这个模块能是打印出来的信息,更加方便阅读:

在cmd中运行:python parse_stations.py > stations.py

就会在当前目录下得到stations.py文件,文件中就是站点名字和简称,在stations.py文件中加入"stations = "这样就是一个字典,方便后面的取值,下面就是stations.py文件的内容:

3.2 现在获取列车信息的参数已经准备齐了,接下来就是拿到列车的返回值,解析出自己需要的信息,比如:车次号,一等座的票数等等。。,myprettytable.py

#coding=utf-8
from prettytable import PrettyTable
class TrainCollection(object):
"""
解析列车信息
"""
# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座
header = '序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座'.split()
def __init__(self,rows,traintypes):
self.rows = rows
self.traintypes = traintypes
def _get_duration(self,row):
"""
获取车次运行的时间
"""
duration = row.get('lishi').replace(':','小时') + '分'
if duration.startswith('00'):
return duration[4:]
elif duration.startswith('0'):
return duration[1:]
return duration
@property
def trains(self):
result = []
flag = 0
for row in self.rows:
if row['station_train_code'][0] in self.traintypes:
flag += 1
train = [
# 序号
flag,
# 车次
row['station_train_code'],
# 出发、到达站点
'/'.join([row['from_station_name'],row['to_station_name']]),
# 成功、到达时间
'/'.join([row['start_time'],row['arrive_time']]),
# duration 时间
self._get_duration(row),
# 商务座
row['swz_num'],
# 一等座
row['zy_num'],
# 二等座
row['ze_num'],
# 软卧
row['rw_num'],
# 硬卧
row['yw_num'],
# 硬座
row['yz_num'],
# 无座
row['wz_num']
]
result.append(train)
return result
def print_pretty(self):
"""打印列车信息"""
pt = PrettyTable()
pt._set_field_names(self.header)
for train in self.trains:
pt.add_row(train)
print(pt)
if __name__ == '__main__':
t = TrainCollection()

prettytable 这个库是能打印出类似mysql查询数据显示出来的格式,

4、接下来就是整合各个模块:tickets.py

"""Train tickets query via command-line.
Usage:
tickets [-gdtkz] <from> <to> <date>
Options:
-h,--help 显示帮助菜单
-g 高铁
-d 动车
-t 特快
-k 快速
-z 直达
Example:
tickets -gdt beijing shanghai 2016-08-25
"""
import requests
from docopt import docopt
from stations import stations
# from pprint import pprint
from myprettytable import TrainCollection
class SelectTrain(object):
def __init__(self):
"""
获取命令行输入的参数
"""
self.args = docopt(__doc__)#这个是获取命令行的所有参数,返回的是一个字典
def cli(self):
"""command-line interface"""
# 获取 出发站点和目标站点
from_station = stations.get(self.args['<from>']) #出发站点
to_station = stations.get(self.args['<to>']) # 目的站点
leave_time = self._get_leave_time()# 出发时间
url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate={0}&from_station={1}&to_station={2}'.format(
leave_time,from_station,to_station)# 拼接请求列车信息的Url
# 获取列车查询结果
r = requests.get(url,verify=False)
traindatas = r.json()['data']['datas'] # 返回的结果,转化成json格式,取出datas,方便后面解析列车信息用
# 解析列车信息
traintypes = self._get_traintype()
views = TrainCollection(traindatas,traintypes)
views.print_pretty()
def _get_traintype(self):
"""
获取列车型号,这个函数的作用是的目的是:当你输入 -g 是只是返回 高铁,输入 -gd 返回动车和高铁,当不输参数时,返回所有的列车信息
"""
traintypes = ['-g','-d','-t','-k','-z']
# result = []
# for traintype in traintypes:
# if self.args[traintype]:
# result.append(traintype[-1].upper())
trains = [traintype[-1].upper() for traintype in traintypes if self.args[traintype]]
if trains:
return trains
else:
return ['G','D','T','K','Z']
def _get_leave_time(self):
"""
获取出发时间,这个函数的作用是为了:时间可以输入两种格式:2016-10-05、20161005
"""
leave_time = self.args['<date>']
if len(leave_time) == 8:
return '{0}-{1}-{2}'.format(leave_time[:4],leave_time[4:6],leave_time[6:])
if '-' in leave_time:
return leave_time
if __name__ == '__main__':
cli = SelectTrain()
cli.cli()

好了,基本上就结束了,按照开头的哪样,就能查询你想要的车次信息了

以上所述是小编给大家介绍的Python脚本实现12306火车票查询系统,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
, 火车票查询
火车票12306
python 脚本登录12306、python实现12306抢票、12306 火车票并发实现、python实现火车票查询、12306抢票脚本,以便于您获取更多的相关知识。

时间: 2024-10-24 20:51:33

Python脚本实现12306火车票查询系统_python的相关文章

Python脚本实现下载合并SAE日志_python

由于一些原因,需要SAE上站点的日志文件,从SAE上只能按天下载,下载下来手动处理比较蛋疼,尤其是数量很大的时候.还好SAE提供了API可以批量获得日志文件下载地址,刚刚写了python脚本自动下载和合并这些文件 调用API获得下载地址 文档位置在这里 设置自己的应用和下载参数 请求中需要设置的变量如下 复制代码 代码如下: api_url = 'http://dloadcenter.sae.sina.com.cn/interapi.php?' appname = 'xxxxx' from_da

Python脚本实现Web漏洞扫描工具_python

这是去年毕设做的一个Web漏洞扫描小工具,主要针对简单的SQL注入漏洞.SQL盲注和XSS漏洞,代码是看过github外国大神(听说是SMAP的编写者之一)的两个小工具源码,根据里面的思路自己写的.以下是使用说明和源代码. 一.使用说明: 1.运行环境: Linux命令行界面+Python2.7 2.程序源码: Vim scanner//建立一个名为scanner的文件 Chmod a+xscanner//修改文件权限为可执行的 3.运行程序: Python scanner//运行文件 若没有携

Python脚本实时处理log文件的方法_python

这个Python脚本是用来对实时文件的内容监控,比如 Error 或者 time out 字段都可以进行自定义:算是我的第一个真正的Python脚本,自己感觉还是比较臃肿,不过打算放到blog上记录一下(还是初学者,大神们勿喷哈),真心希望博友们能够再指点一下(现在记录每次的文件大小值是输出到了一个文件中,并且里面还嵌套了有shell命令,这些我认为都是可以优化掉的吧,只是现在我还不知道怎么做):告警是基于zabbix,自定义的模板是120s执行一次 #!/usr/local/bin/pytho

php实现12306火车票余票查询和价格查询(12306火车票查询)_php实例

name.php 复制代码 代码如下: <?phpreturn array(        "北京北" => "VAP",        "北京东" => "BOP",        "北京" => "BJP",        "北京南" => "VNP",        "北京西" => &

python脚本实现查找webshell的方法_python

本文讲述了一个python查找 webshell脚本的代码,除了查找webshell功能之外还具有白名单功能,以及发现恶意代码发送邮件报警等功能,感兴趣的朋友可以自己测试一下看看效果. 具体的功能代码如下: #!/usr/bin/env python #-*- coding: utf-8 -*- import os import sys import re import smtplib #设定邮件 fromaddr = "smtp.qq.com" toaddrs = ["vo

火车票查询系统升级 惠及亿万返乡民众

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 2011年的元旦和春节临近之际,去哪网旅游搜索引擎为更好地提供旅游出行服务信息,近日通过最新技术升级了火车票查询系统,为广大返乡和出行民众开始免费提供网上实时查询剩余火车票功能. 记者在去哪(http://www.quna.com)网站看到,升级后的火车票查询系统不仅可以查询各列车车次.时间.列车票价,还提供了余票查询功能;旅客只需输入车次,

利用Python实现命令行版的火车票查看器_python

接口设计 一个应用写出来最终是要给人使用的,哪怕只是给你自己使用.所以,首先应该想想你希望怎么使用它?让我们先给这个小应用起个名字吧,既然及查询票务信息,那就叫它tickets好了.我们希望用户只要输入出发站,到达站以及日期就让就能获得想要的信息,所以tickets应该这样被使用: $ tickets from to date 另外,火车有各种类型,高铁.动车.特快.快速和直达,我们希望可以提供选项只查询特定的一种或几种的火车,所以,我们应该有下面这些选项:      -g 高铁      -d

php实现12306火车票余票查询和价格查询

 这篇文章主要介绍了使用php实现的12306火车票余票查询和价格查询功能,大家参考使用吧 name.php 代码如下: <?php return array(         "北京北" => "VAP",         "北京东" => "BOP",         "北京" => "BJP",         "北京南" => &

Python脚本实现集群检测和管理功能_python

场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法--利用一台机器来管理所有的机器,记录设备责任人.设备使用状态等等信息....那么,为什么选择python,python足够简单并且拥有丰富的第三方库的支持. 最初的想法 由于刚参加工作不久,对这些东西也都没有接触过,轮岗到某个部门需要做出点东西来(项目是什么还没情况,就要做出东西来,没办法硬着头皮想点子吧)... 本想做一个简单点的自动