(二)、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吧!
调用resolveData():
成功获取到了result信息,接下来我们就需要解析这一长串的数据了。
观察这一长串字符我们还是能发现规律的,所有的信息都以”|”为分割线,图中已经显示了一些信息,其他信息需要我们观察多个result结果才能找出对应位置。
解析result信息:
同12306官网进行对比,查询解析准确。搞定!
下一步我们将使数据输出的更加漂亮。
下一篇–>漂亮的输出—–prettytable和colorama的使用
18a0c
首先我们来看看每查询一条信息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余票:添加票价信息
- 利用百度车联网提供的天气查询接口用python查询天气信息以及安卓(Java)利用gson解析数据
- 基于python的-全国旅游信息查询系统(json解析)
- 解决Python查询Mysql数据库信息乱码问题
- python 编写爬12306列车信息脚本
- 基于python的手机号码归属信息查询系统
- java抓取数据包查询12306余票信息
- Python_模拟登录(爬取教务系统信息并制作查询界面)
- 解决Python查询Mysql数据库信息乱码问题
- iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)
- Python实现的查询mysql数据库并通过邮件发送信息功能
- python解析51cto博客用户的相关信息
- Python脚本实现12306火车票查询系统
- python解析网页查询IP所属地
- 解决Python查询Mysql数据库信息乱码问题
- iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)
- Python 解析爬取的车次数据(12306)
- 用python 通过12306api抓取列车信息
- 使用Python和Splinter实现12306火车票查询与抢票
- 小菜鸟的python学习之路----信息查询系统