欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最新Python实现12306余票查询系统

程序员文章站 2022-04-07 09:03:48
...

首先感谢这篇博客的引导,但是这篇文章已经比较旧了,12306进行了改版,源码编排方式有了变化。12306源码获取的方法可以从这篇博客中学习,我在这里主要贴出对于目前最新的12306的Python余票查询程序,可供用于学习Python的基本用法,正则表达的使用,简单爬虫的使用。下面是效果图,因为我用的是windows,对命令框里的代码着色比较麻烦,有兴趣的朋友可以自己尝试去给输出的文字添加颜色。
最新Python实现12306余票查询系统

#####################获取站台字典,已放在stations.py无需运行######################
#import re
#import urllib
#import ssl
#from urllib import request
#import requests
#from pprint import pprint
#ssl._create_default_https_context = ssl._create_unverified_context
#url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9018'
#req = urllib.request.Request(url)
#r = urllib.request.urlopen(req).read().decode('utf-8')
##print (r)
#stations =re.findall(r'([\u4e00-\u9fa5]+)\|([A-Z]+)',r) #匹配中文和对应的英文
#stations = dict(stations)
#stations = dict(zip( stations.keys(),stations.values()))#将匹配的内容转化为字典
#pprint(stations)                                        #以列的形式打印出来
################################################################################
################################################################################
#功能:12306余票查询
#作者:wildwind_
#时间:2017.07.08
################################################################################
import re
from station import stations
import warnings
import json
import urllib
from urllib import request
import requests
from pprint import pprint
from prettytable import PrettyTable
#输入引导
f1= input('请输入起始城市:\n')
f = stations[f1]

t1= input('请输入目的城市:\n')
t = stations[t1]

d1=input('请输入出发时间: \n')
d=str('2017-')+str(d1)                   #这里讲年份设置为固定值,可以减少输入操作。
print ('正在查询'+f1+'至'+t1+'的列车,请稍等...')  #个性旁白
#获取数据
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date='+d+'&leftTicketDTO.from_station='+f+'&leftTicketDTO.to_station='+t+'&purpose_codes=ADULT'
warnings.filterwarnings("ignore")         #这个网站是有安全警告的,这段代码可以忽略警告
r = requests.get(url, verify=False)   #请求网址的内容
rows = r.json()['data']['result']      #将内容解析为列表
data1 = []
data = []
for m in rows:
    data1.append(re.findall(r'[\u4e00-\u9fa5]订(.*)|[\u4e00-\u9fa5]售(.*)|[\u4e00-\u9fa5]运(.*)',m))
for n in data1:
    data.append(str(n).split('|'))
#制作表格
trains= PrettyTable()
trains.field_names=["车次","车站","时间","历时","商务特等座","一等座","二等座","高级软卧","软卧","动卧","硬卧 ","软座 ","硬座","无座","其他"]
                                              #设置table的header
num = len(data)                       #打印列表的个数
stations_new= dict(zip(stations.values(), stations.keys()))
for row in data :                                                #列表循环
    trains.add_row([row[2],
                   '\n'.join([stations_new[row[5]],stations_new[row[6]]]),
                   '\n'.join([row[7], row[8]]),row[9],
                   row[-4] if row[-4] != '' else '--',row[-5] if row[-5] != '' else '--',
                   row[-6] if row[-6] != '' else '--',row[-15] if row[-15] != '' else '--',
                   row[-13] if row[-13] != '' else '--',row[-3] if row[-3] != '' else '--',
                   row[-8] if row[-8] != '' else '--',row[-11] if row[-11] != '' else '--',
                   row[-7] if row[-7] != '' else '--',row[-10] if row[-10] != '' else '--',
                   row[-14] if row[-14] != '' else '--'])
print ('查询结束,共有 %d 趟列车。'%num )   #列表个数也就是列车个数
print (trains)