python实现12306火车票查询

python实现12306火车票查询

注:该文是本博主记录学习之用,没有太多详细的讲解,敬请谅解!

某天突然心血来潮,想熟悉下python(目前零接触python),加上年尾将近,车票成了年底热议的话题,故本文由此而生。

由于本人是Java出身,故学习python难度不大,虽语法不同,但大同小异,故此手写一个低配版车票查询功能。本文不提供python环境的说明,各位有兴趣的可自行上网查询学习,敬请见谅!

本文是基于学习之用,故以下代码不是非常完善的功能,只是做个简单的查询功能,各种异常情况没有处理,有兴趣的同学可自行完善!

代码实现

import requests
import json
import os

'''
 1、简陋版的车票查询
'''
class TrainTickets:

    def __init__(self):
        self.filename = 'station_name.txt'
        self.stationCodeUrl="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js" #获取城市代码地址
        self.trainTicketsUrl="https://kyfw.12306.cn/otn/leftTicket/queryA?"  #12306车票查询地址

    #下载城市代码
    def downloadStationCode(self):
        response = requests.get(self.stationCodeUrl);
        with open(self.filename, 'w') as f:
            for each in response.text.split('=')[1].split('@'):
                if each != "'":
                    f.write(each)
                    f.write('\n')


    #查询城市代码
    def searchStationCode(self,from_station,to_station):
        stationCode={}
        if not (os.path.exists(os.getcwd()+self.filename)):
            self.downloadStationCode()
        with open("station_name.txt",'r') as f:
            for line in f:
                content=line.split("|")
                if(from_station==content[1]):
                    stationCode[0]=content[2]   # 出发城市代码
                if (to_station == content[1]):
                    stationCode[1] = content[2] # 到达城市代码
        return stationCode


    #查询车票
    def searchTrainTickets(self,from_station,to_station,train_date):
        #城市名称转为城市代码
        stationCode = t.searchStationCode(from_station, to_station)

        prefix="leftTicketDTO."; #请求参数前缀
        from_station=prefix+"from_station="+stationCode[0] #始发地
        to_station=prefix+"to_station="+stationCode[1]  #目的地
        train_date=prefix+"train_date="+train_date  #出发日
        self.trainTicketsUrl+=train_date+"&"+from_station+"&"+to_station+"&purpose_codes=ADULT"; #参数必须按照顺序来,否则调用不了

        response=requests.get(self.trainTicketsUrl);
        if response.status_code == 200 :
            try:
                result=json.loads(response.text).get("data")
                dataList=result.get("result")
                map=result.get("map")
                for datas in dataList:
                    data=datas.split("|")
                    print("车次:%s  始发站:%s  终点站:%s  出发时间:%s  到达时间:%s   历时:%s  商务座特等座:%s  一等座:%s  二等座:%s  高级软卧:%s  软卧:%s  动卧:%s  硬卧:%s  软座:%s  硬座:%s  无座:%s"
                          %(data[3],map[data[6]],map[data[7]],data[8],data[9],data[10],data[32],data[31],data[30],data[21],data[23],data[33],data[26],data[27],data[28],data[29]))

            except Exception as e:
                print("抓取数据失败:",e)
        else:
            print("抓取数据失败")


#执行main方法
if __name__ == "__main__":
    t=TrainTickets()
    t.searchTrainTickets('广州', '武汉', '2018-12-27')


  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值