Python獲取12306網站車次
阿新 • • 發佈:2019-01-04
可單獨獲取城市到城市的車次、出發時間、耗時時間、到達時間 ,以及餘票資訊。修改最後三行的字串執行使用。或修改為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)