火车余票查询(python)

通过python可以对火车票余票进行查询。

一、获取并构建url地址

进入12306火车票查询,点击F12,尝试查询北京到上海的火车票,可以看到,它从某个url地址获取到了相关json类型数据,而返回的数据正是我们所需要的。


可以看出,该url地址提供了三个接口分别为train_date(时间),from_station(出发地),to_station(目的地),我们所要做的,就是构建这个url地址。

url2=("https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}"
"&leftTicketDTO.from_station={}"
"&leftTicketDTO.to_station={}"
"&purpose_codes=ADULT").format(time,from_area,to_area)

接口中出发地和目的地都需要用相应的字母代替,所以我们要找到这个转换规则。


不难看出,我们找到了它的url地址,通过这个地址,我们可以看到它的相关转化。


因此,我们需要用到正则表达式将它提取出来,并保存在一个字典中。

import re,requests
url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9051"
html1=requests.get(url1).text
area=re.findall("([\u4E00-\u9FA5]+)\|([A-Z]+)",html1)
area=dict(area)

接下来就是通过地点获取它的字母数据

from_area=area[input("出发地")]
to_area=area[input("目的地")]
time=input("时间(年-月-日)")

(注意输入时时间格式2018-04-15)

自此,我们就可以完整构建一个url地址。

二、获取相关数据
html2=requests.get(url2)
s=html2.json()["data"]["result"]
t=html2.json()["data"]["map"] #获得到一个字典
三、输出相关数据

在这里我使用了漂亮表格输出,所以我引用了模块PrettyTable

from prettytable import PrettyTable
table=PrettyTable(["车次","出发站","到达站","出发时间","到达时间","历时","特等座","一等座","二等座","软卧","硬卧","软座","硬座","无座"])

for area_new in s:
    list=area_new.split("|")
    YUNXIN=list[1]
    if YUNXIN=="列车停运":
        continue
    no=list[3]
    from_area=list[6]
    to_area=list[7]
    star_time=list[8]
    over_time=list[9]
    pass_time=list[10]
    TDZ=list[32] or"--"
    YDZ=list[31] or"--"
    EDZ=list[30] or"--"
    RW=list[23] or "--"
    YW=list[28] or "--"
    RZ=list[27] or"--"
    YZ=list[29] or"--"
    WZ=list[26] or"--"
    table.add_row([no,t[from_area],t[to_area],star_time,over_time,pass_time,TDZ,YDZ,EDZ,RW,YW,RZ,YZ,WZ])
print(table)
四、完整代码
import re,requests
from prettytable import PrettyTable

url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9051"
html1=requests.get(url1).text
area=re.findall("([\u4E00-\u9FA5]+)\|([A-Z]+)",html1)
area=dict(area)

from_area=area[input("出发地")]
to_area=area[input("目的地")]
time=input("时间(年-月-日)")
url2=("https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}"
"&leftTicketDTO.from_station={}"
"&leftTicketDTO.to_station={}"
"&purpose_codes=ADULT").format(time,from_area,to_area)

html2=requests.get(url2)
s=html2.json()["data"]["result"]
t=html2.json()["data"]["map"]

table=PrettyTable(["车次","出发站","到达站","出发时间","到达时间","历时","特等座","一等座","二等座","软卧","硬卧","软座","硬座","无座"])

for area_new in s:
    list=area_new.split("|")
    YUNXIN=list[1]
    if YUNXIN=="列车停运":
        continue
    no=list[3]
    from_area=list[6]
    to_area=list[7]
    star_time=list[8]
    over_time=list[9]
    pass_time=list[10]
    TDZ=list[32] or"--"
    YDZ=list[31] or"--"
    EDZ=list[30] or"--"
    RW=list[23] or "--"
    YW=list[28] or "--"
    RZ=list[27] or"--"
    YZ=list[29] or"--"
    WZ=list[26] or"--"
    table.add_row([no,t[from_area],t[to_area],star_time,over_time,pass_time,TDZ,YDZ,EDZ,RW,YW,RZ,YZ,WZ])
print(table)





阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页