火车余票查询(python)
程序员文章站
2024-01-19 15:40:52
...
通过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)