1. 程式人生 > >Python獲取12306網站車次

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)