python爬蟲之12306網站--火車票信息查詢


python爬蟲之12306網站--火車票信息查詢

思路:

1.火車票信息查詢是基於車站信息查詢,先完成車站信息查詢,然后根據車站信息查詢生成的url地址去查詢當前已知出發站和目的站的所有車次車票信息

2.json文件存儲當前從出發站到目的站的所有車次的詳細信息

3.對json文件進行分析

4.分類查詢車票(高鐵、火車)

1.json文件:在12306頁面選擇"車票"》"單程",打開"開發人員工具",然后輸入出發地、目的地

對json文件進行分析,發現是嵌套的字典,車次的所有詳細信息存儲在"result"中

選擇一條數據然后對其進行分析,找到自己想要的數據(例如車次在的位置,出發站、到達站、座位的種類等等)

這里用的是notepad++軟件,把"|"替換為"\r",這樣就方便自己找到想要的數據對應的位置

代碼如下:

#python 火車票信息的查詢
import requests url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090" txt=requests.get(url1).text inf=txt[:-2].split("@")[1:] #print(inf)
stations={} for record in inf: rlist=record.split("|") stations[rlist[2]]={"cn":rlist[1],"qp":rlist[3],"jp":rlist[4]}  #把車站編碼當作key #print(stations)
def getcode(t): while True: s1=input("%s站:"%t) r1=[] for id,station in stations.items(): if s1 in station.values(): r1.append((id,station)) if r1: break
        print("沒有這個車站。") print("請重新輸入。") if len(r1)==1: sid=r1[0][0] else: print("你需要在以下車站里選擇:") for i in range(len(r1)): print(i+1,r1[i][1]["cn"]) sel=int(input("你的選擇是:"))-1 sid=r1[sel][0] return sid fromstation=getcode("出發") tostation=getcode("到達") chufatime=input("出發日期(格式2019-01-01):").strip() qurl="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(chufatime,fromstation,tostation) print(qurl) print("你輸入的查詢條件是:出發站=%s,到達站=%s"%(stations[fromstation]["cn"],stations[tostation]["cn"])) ainf=requests.get(qurl).json()["data"]["result"]  #json文件存儲當前從出發站到目的站的所有車次的詳細信息 #print(ainf,type(ainf))
result=[] for i in ainf: list=i.split("|") checi=list[3] chufa=stations[list[6]]["cn"] mudi=stations[list[7]]["cn"] ftime=list[8] dtime=list[9] sw=list[32] yd=list[31] rw=list[23] yw=list[26] wuzuo=list[28] ed=list[30] yz=list[29] result.append((checi,chufa,mudi,ftime,dtime,sw,yd,ed,yz,yw,rw,wuzuo)) #print(result)
print("車次\t出發站\t到達站 出發時間 到達時間 商務座 一等座 二等座 硬座 硬卧 軟卧 無座 ") for i in result: for n in range(len(i)): print(i[n],end="\t") print()

 

運行效果如下:

上面顯示的太不友好了,這里用prettytable庫(需要安裝)

from  prettytable import PrettyTable ............ ............ table=PrettyTable(["車次","出發站","目的站","發車時間","到達時間","商務座","一等座","二等座","硬座","硬卧","軟卧","無座"]) for i in result: table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10],i[11]]) print(table)

運行效果如下:

4.分類查詢車票

import requests from  prettytable import PrettyTable url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090" txt=requests.get(url1).text inf=txt[:-2].split("@")[1:] #print(inf)
stations={} for record in inf: rlist=record.split("|") stations[rlist[2]]={"cn":rlist[1],"qp":rlist[3],"jp":rlist[4]}  #把車站編碼當作key #print(stations)
def getcode(t): while True: s1=input("%s站:"%t) r1=[] for id,station in stations.items(): if s1 in station.values(): r1.append((id,station)) if r1: break
        print("沒有這個車站。") print("請重新輸入。") if len(r1)==1: sid=r1[0][0] else: print("你需要在以下車站里選擇:") for i in range(len(r1)): print(i+1,r1[i][1]["cn"]) sel=int(input("你的選擇是:"))-1 sid=r1[sel][0] return sid fromstation=getcode("出發") tostation=getcode("到達") chufatime=input("出發日期(格式2019-01-01):").strip() qurl="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(chufatime,fromstation,tostation) print(qurl) print("你輸入的查詢條件是:出發站=%s,到達站=%s"%(stations[fromstation]["cn"],stations[tostation]["cn"])) ainf=requests.get(qurl).json()["data"]["result"]  #json文件存儲當前從出發站到目的站的所有車次的詳細信息 #print(ainf,type(ainf))
result=[] gaotie=[] huoche=[] for i in ainf: list=i.split("|") checi=list[3] chufa=stations[list[6]]["cn"] mudi=stations[list[7]]["cn"] ftime=list[8] dtime=list[9] sw=list[32] yd=list[31] rw=list[23] yw=list[26] wuzuo=list[28] ed=list[30] yz=list[29] result.append((checi,chufa,mudi,ftime,dtime,sw,yd,ed,yz,yw,rw,wuzuo)) if checi[0] in ["G","D"]: gaotie.append([checi,chufa,mudi,ftime,dtime,sw,yd,ed]) else: huoche.append([checi,chufa,mudi,ftime,dtime,yz,yw,rw,wuzuo]) #print(result)
while True: print("請輸入查看信息:1、全部 2、高鐵、動車 3、火車 4、退出") show=int(input("請選擇:")) if show==1: table=PrettyTable(["車次","出發站","目的站","發車時間","到達時間","商務座","一等座","二等座","硬座","硬卧","軟卧","無座"]) for i in result: table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10],i[11]]) print(table) elif show==2: table=PrettyTable(["車次","出發站","目的站","發車時間","到達時間","商務座","一等座","二等座"]) for i in gaotie: table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7]]) print(table) elif show==3: table=PrettyTable(["車次","出發站","目的站","發車時間","到達時間","硬座","硬卧","軟卧","無座"]) for i in huoche: table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8]]) print(table) elif show==4: print("查詢結束!") break
    else: print("輸入錯誤請重新輸入!")

運行效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM