欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

火车余票查询(python)

程序员文章站 2024-01-19 15:40:52
...

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

一、获取并构建url地址

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

火车余票查询(python)

可以看出,该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)

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

火车余票查询(python)

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

火车余票查询(python)

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

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)