## 用python3爬取12306余票信息
先引用这个库里的车次对应信息https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971
为此先写一个.py文件,命名为stationsInfo.py
import re,requests
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971'
response = requests.get(url, verify=False)
stations = re.findall(r'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)
station_codes=dict(stations)
station_names=dict(zip(station_codes.values(),station_codes.keys()))
然后这里重头戏,
from tabulate import tabulate
import requests,re,datetime,time,json,datetime
from tkinter import*
from tkinter import messagebox
from stationsInfo import station_codes,station_names
from colorama import init,Fore,Back,Style
def query():
date=input("请输入日期(格式xxxx-xx-xx):\n")
from_station=station_codes[input("请输入起始站:\n")]
to_station=station_codes[input("请输入目地站:\n")]
url="https://kyfw.12306.cn/otn/leftTicket/query?"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400"
}
#time=entry_time.get()
#start=entry_start.get()
#end=entry_end.get()
url=url+'leftTicketDTO.train_date='+date+'&leftTicketDTO.from_station='+from_station+'&leftTicketDTO.to_station='+to_station+'&purpose_codes=ADULT'
#print(url)
#html=getHtmltext(url,headers)
#showTicket(html)
requests.packages.urllib3.disable_warnings()
r = requests.get(url,verify=False).json()
yupiao = r['data']['result']
table_header = ['车次','始发站','到达站','始发时间','到站时间','历时','商务特等座','一等座','二等座','高级软卧','软卧','动卧','硬卧','软座','硬座','无座'] #表格头
table_data = [] #数据添加至列表,作为表格的主体内容
for i in yupiao:
a = i.split('|') #分割字符串,a是个列表
is_null = a[0] #判断是否有票
train_code = a[3] #车次
from_station = station_names[a[6]] #始发站城市代码并转换
to_station = station_names[a[7]] #到达站城市代码并转换
start_time = a[8] #出发时间
end_time = a[9] #到达时间
total_time = a[10] #总共历时
shangwutedeng = a[32] #商务特等座
yideng = a[31] #一等座
erdeng = a[30] #二等座
gaojiruanwo = a[21] #高级软卧
ruanwo = a[23] #软卧
dongwo = a[33] #动卧
yingwo = a[28] #硬卧
ruanzuo = a[24] #软座
yingzuo = a[29] #硬座
wuzuo = a[26] #无座
#添加到元组
yupiao_tuple = (train_code,from_station,to_station,start_time,end_time,total_time,shangwutedeng,yideng,erdeng,gaojiruanwo,ruanwo,dongwo,yingwo,ruanzuo,yingzuo,wuzuo)#余票元组
table_data.append(yupiao_tuple)
print(tabulate(table_data,headers=table_header,tablefmt='grid'))
query()