# 获取12306地区简写
# coding=gbk
"""命令行火车票查看器
Usage:
tickets [-gdtkz] <from> <to> <date>
Options:
-h --help Show help screen.
-v,--version 0.0.1.
--g 高铁.
--d 动车.
--t 特快.
--k 快速.
--z 直达.
Example:
tickets 北京 上海 2016-10-10
tickets -dg 成都 南京 2016-10-10
"""
from docopt import docopt
import requests
import re
from pprint import pprint
# 获取站点名的简称
def get_stationName_abb():
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8988'
# 添加verify=False参数不验证证书
response = requests.get(url, verify=False)
# [\u4e00-\u9fa5]匹配中文
# [('北京北', 'VAP', 'beijingbei', 'bjb'), ('北京东', 'BOP', 'beijingdong', 'bjd'),
stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)\|([a-z]+)\|([a-z]+)', response.text)
# [('北京北', 'VAP', 'beijingbei', 'bjb', '0'), ('北京东', 'BOP', 'beijingdong', 'bjd', '1'),
# stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)\|([a-z]+)\|([a-z]+)\|(\d)', response.text)
# 入库操作
for i in stations:
# print(i[0],i[1],i[2],i[3])
sql = "insert into address_12306(address,address_yw,qc,jx) values('%s','%s','%s','%s')"%(i[0],i[1],i[2],i[3])
print(sql)
db1.insert(sql)
print(stations)
if __name__ == '__main__':
# arguments = docopt(__doc__)
get_stationName_abb()
对接12306火车票查询接口
# coding=gbk
import requests
train_date = '2023-03-19' #出发日期
from_station = 'BJP' # 出发地简称缩写
to_station = 'SHH' # 目的地简称缩写
purpose_codes = 'ADULT' #乘客类型(成儿&学生),ADULT是成人,学生是0X00
# res = requests.get("https://kyfw.12306.cn/otn/leftTicket/log?leftTicketDTO.train_date='%s'&leftTicketDTO.from_station='%s'&leftTicketDTO.to_station='%s'&purpose_codes='%s'"%(train_date,from_station,to_station,purpose_codes))
# print(res.text)
res = requests.get("https://kyfw.12306.cn/otn/leftTicketPrice/query?leftTicketDTO.train_date=2022-03-18&leftTicketDTO.from_station=SHH&leftTicketDTO.to_station=BJP&leftTicketDTO.ticket_type=1&randCode=stzh")
print(res.json()['data'])
data数据
项目中使用
class Addresss(Resource):
def post(self):
parser = reqparse.RequestParser()
# 添加验证参数id
parser.add_argument('from_station', type=str, help='出发地')
parser.add_argument('purpose_codes', type=str, help='成人还是学生')
parser.add_argument('to_station', type=str, help='目的地')
parser.add_argument('train_date', type=str, help='出发时间')
# 启动检验处理
args = parser.parse_args()
# 查询出发地 和目的地是否存在
sql = "select address_yw from address_12306 where address='%s'" % (args['from_station'])
res = db1.find(sql)
if res:
# 查询目的地是否存在
sql = "select address_yw from address_12306 where address='%s'" % (args['to_station'])
res1 = db1.find(sql)
if res1:
if args['purpose_codes']:
if args['train_date'] == None:
return jsonify({'code': 403, 'msg': '请选择出发时间'})
else:
# 12306发起请求
print(args)
data = {'leftTicketDTO.train_date': args['train_date'], 'leftTicketDTO.from_station': res['address_yw'],
'leftTicketDTO.to_station':res1['address_yw'] , 'purpose_codes': args['purpose_codes']}
res =requests.get("https://kyfw.12306.cn/otn/leftTicketPrice/query?",params=data)
return jsonify({'code': 200, 'list': res.json()['data'],'msg':'查询成功'})
else:
return jsonify({'code': 403, 'msg': '请选择票种'})
else:
return jsonify({'code': 403, 'msg': '目的地不存在'})
else:
return jsonify({'code': 403, 'msg': '出发地不存在'})
api.add_resource(Addresss, '/address_12306')