Python获取12306网站车次

可单独获取城市到城市的车次、出发时间、耗时时间、到达时间 ,以及余票信息。修改最后三行的字符串运行使用。或修改为for循环实现批量获取。代码网络获取并加以修改。

import requests
import re

#关闭https证书验证警告
requests.packages.urllib3.disable_warnings()
# 12306的城市名和城市代码js文件url
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9018'
r = requests.get(url,verify=False)
pattern = u'([\u4e00-\u9fa5]+)\|([A-Z]+)'
result = re.findall(pattern,r.text)
station = dict(result)
import requests
import json

# 关闭https证书验证警告
requests.packages.urllib3.disable_warnings()

# 城市名代码查询字典
# key:城市名 value:城市代码
#from .stations import stations_dict
# 反转k,v形成新的字典
code_dict = {v: k for k, v in station.items()}
stations_dict=station
def get_query_url(text):
    '''
    返回调用api的url链接
    '''
    # 解析参数 aggs[0]里是固定字符串:车票查询 用于匹配公众号接口
    args = str(text).split(' ')
    try:
        date = args[1] 
        from_station_name = args[2] 
        to_station_name = args[3]
        from_station=stations_dict[from_station_name]
        to_station = stations_dict[to_station_name]
    except:
        date,from_station,to_station='--','--','--' 
    #将城市名转换为城市代码
    
    # api url 构造
    url = (
        'https://kyfw.12306.cn/otn/leftTicket/query?'
        'leftTicketDTO.train_date={}&'
        'leftTicketDTO.from_station={}&'
        'leftTicketDTO.to_station={}&'
        'purpose_codes=ADULT'
    ).format(date, from_station, to_station)
#    print(url)
    
    return url

def query_train_info(url):
    '''
    查询火车票信息:
    返回 信息查询列表
    '''

    info_list = []
    try:
        r = requests.get(url, verify=False)
        # 获取返回的json数据里的data字段的result结果
        raw_trains = r.json()['data']['result']

        for raw_train in raw_trains:
            # 循环遍历每辆列车的信息
            data_list = raw_train.split('|')

            # 车次号码
            train_no = data_list[3]
            # 出发站
            from_station_code = data_list[6]
            from_station_name = code_dict[from_station_code]
            # 终点站
            to_station_code = data_list[7]
            to_station_name = code_dict[to_station_code]
            # 出发时间
            start_time = data_list[8]
            # 到达时间
            arrive_time = data_list[9]
            # 总耗时
            time_fucked_up = data_list[10]
            # 一等座
            first_class_seat = data_list[31] or '--'
            # 二等座
            second_class_seat = data_list[30]or '--'
            # 软卧
            soft_sleep = data_list[23]or '--'
            # 硬卧
            hard_sleep = data_list[28]or '--'
            # 硬座
            hard_seat = data_list[29]or '--'
            # 无座
            no_seat = data_list[26]or '--'

            # 打印查询结果
            info = ('车次:{}\n出发站:{}\n目的地:{}\n出发时间:{}\n到达时间:{}\n消耗时间:{}\n座位情况:\n 一等座:「{}」 \n二等座:「{}」\n软卧:「{}」\n硬卧:「{}」\n硬座:「{}」\n无座:「{}」\n\n'.format(
                train_no, from_station_name, to_station_name, start_time, arrive_time, time_fucked_up, first_class_seat,
                second_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat))

            info_list.append(info)

        return info_list
    except:
        return ' 输出信息有误,请重新输入'
hc=["哈尔滨","齐齐哈尔","大庆","牡丹江","绥化","长春",
       "吉林","延吉","四平","辽源","松原"]
zsj=["广州","深圳","珠海","惠州","东莞","肇庆","佛山","中山","江门东"]
csj=["上海","南京","无锡","常州","苏州","南通","盐城",
     "扬州","镇江","泰州","杭州","宁波","嘉兴","湖州",
     "绍兴","金华","舟山","台州","合肥","芜湖","马鞍山",
     "铜陵","安庆","滁州","池州","宣城"]
cy=["重庆","成都","自贡","泸州","德阳","绵阳","遂宁","内江",
    "乐山","南充","眉山","宜宾","广安","达州","雅安","资阳"]
citys=csj
def csq(citys):
    for i in citys:
        n=0
        for j in citys:
            chaxun=r" 2018-07-20 "+i+" "+j
            cc=query_train_info(get_query_url(chaxun))
            trains=[]
            for eachtrain  in cc:
                if eachtrain[3:4]=="G" or eachtrain[3:4]=="C":
                    huan=eachtrain.find("\n")
    #                print(eachtrain[3:huan]+" "+i+"-"+j)
                    trains.append(eachtrain[3:huan])
    #        print(i+"-"+j+" "+str(len(trains)))
            n=n+len(trains)
    
        print (i+" "+str(n))

chaxun=r" 2018-07-25 "+"北京"+" "+"广州"
cc=query_train_info(get_query_url(chaxun))
print (cc)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值