您的位置:首页 > 编程语言 > Python开发

(二)、Python查询12306余票:联网查询余票信息并解析

2018-01-02 22:24 435 查看
前一篇–>实现始发站、终点站和出发日期的合法性检验

首先我们来看看每查询一条信息12306网站返回的信息:



请求链接:

https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date=2018-01-31&leftTicketDTO.from_station=XAY&leftTicketDTO.to_station=GZG&purpose_codes=ADULT

很显然我们只需要关注三个参数:train_date,from_station,to_station。

我们现在先不考虑其他值,先通过这个链接获得result吧!

import requests
import urllib
import json

"""获取data"""
def getData(url):
data = ''
while 1:
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
# 关键代码:###############################################
req = urllib.request.Request(url=url, headers=headers)
data = urllib.request.urlopen(req).read().decode('utf-8')
###########################################################
if data.startswith(u'\ufeff'):
data = data.encode('utf8')[3:].decode('utf-8')
break
except:
continue
return data

"""获取result"""
def resolveData():
#查询链接
url = 'https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date=2018-01-31&leftTicketDTO.from_station=XAY&leftTicketDTO.to_station=GZG&purpose_codes=ADULT'
#获取数据
while 1:
try:
data = getData(url)
lists = json.loads(data)["data"]["result"]
break
except:
continue#获取失败则重新获取
for item in lists:#打印result信息
print(item)


调用resolveData():



成功获取到了result信息,接下来我们就需要解析这一长串的数据了。



观察这一长串字符我们还是能发现规律的,所有的信息都以”|”为分割线,图中已经显示了一些信息,其他信息需要我们观察多个result结果才能找出对应位置。

解析result信息:

"""获取result"""
def resolveData():
#查询链接
url = 'https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date=2018-01-31&leftTicketDTO.from_station=XAY&leftTicketDTO.to_station=GZG&purpose_codes=ADULT'    #获取数据
while 1:
try:
data = getData(url)
lists = json.loads(data)["data"]["result"]
break
except:
continue
cont = []
name = [
"station_train_code",
"from_station_name",
'start_time',
"lishi",
"swz_num",
"zy_num",
"ze_num",
"gr_num",
"rw_num",
"dw_num",
"yw_num",
"rz_num",
"yz_num",
"wz_num",
"qt_num",
"note_num"
]

for items in lists:#遍历result的每一项
#data字典用于存放每一车次的余票信息
data = {
"station_train_code": '',
"from_station_name": '',
"to_station_name": '',
'start_time': '',
'end': '',
"lishi": '',
"swz_num": '',
"zy_num": '',
"ze_num": '',
"dw_num": '',
"gr_num": '',
"rw_num": '',
"yw_num": '',
"rz_num": '',
"yz_num": '',
"wz_num": '',
"qt_num": '',
"note_num": ''
}
item = items.split('|')#用"|"进行分割
data['station_train_code'] = item[3]#车次在3号位置
data['from_station_name'] = item[6]#始发站信息在6号位置
data['to_station_name'] = item[7]#终点站信息在7号位置
data['start_time'] = item[8]#出发时间信息在8号位置
data['arrive_time'] = item[9]#抵达时间在9号位置
data['lishi'] = item[10]#经历时间在10号位置
data['swz_num'] = item[32] or item[25]# 特别注意:商务座在32或25位置
data['zy_num'] = item[31]#一等座信息在31号位置
data['ze_num'] = item[30]#二等座信息在30号位置
data['gr_num'] = item[21]#高级软卧信息在31号位置
data['rw_num'] = item[23]#软卧信息在23号位置
data['dw_num'] = item[27]#动卧信息在27号位置
data['yw_num'] = item[28]#硬卧信息在28号位置
data['rz_num'] = item[24]#软座信息在24号位置
data['yz_num'] = item[29]#硬座信息在29号位置
data['wz_num'] = item[26]#无座信息在26号位置
data['qt_num'] = item[22]#其他信息在22号位置
data['note_num'] = item[1]#备注在1号位置

#如果没有信息则用“-”代替
for pos in name:
if data[pos] == '':
data[pos] = '-'

cont.append(data)
tickets = []#存放所有车次的余票信息
#格式化添加进tickets中
for x in cont:
tmp = []
for y in name:
if y == "from_station_name":
s = stations2CN[x[y]] + '--' + stations2CN[x["to_station_name"]]
tmp.append(s)
elif y == "start_time":
s = x[y] + '--' + x["arrive_time"]
tmp.append(s)
elif y == "station_train_code":
s = x[y]
tmp.append(s)
else:
tmp.append(x[y])
tickets.append(tmp)
return tickets#返回所有车次余票信息

if __name__ == "__main__":#main方法
tickets = resolveData()
for ticket in tickets:
print(ticket)




同12306官网进行对比,查询解析准确。搞定!

下一步我们将使数据输出的更加漂亮。

下一篇–>漂亮的输出—–prettytable和colorama的使用

18a0c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 12306 余票查询