1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| import requests import json from openpyxl import Workbook from prettytable import PrettyTable from save_city_list import get_city_data
class GetTrains: def __init__(self, date, begin_id, end_id): self.url = "https://kyfw.12306.cn/otn/leftTicket/query" self.cookies = { '_uab_collina': '171324859263120074949415', 'JSESSIONID': '708D9C6917F9858184F462E86DC45BD0', '_jc_save_fromStation': '%u82CF%u5DDE%2CSZH', '_jc_save_toStation': '%u6C5D%u5DDE%2CROF', '_jc_save_fromDate': '2024-04-30', '_jc_save_wfdc_flag': 'dc', 'route': '9036359bb8a8a461c164a04f8f50b252', 'BIGipServerotn': '1172832522.24610.0000', 'BIGipServerpassport': '854065418.50215.0000', 'guidesStatus': 'off', 'highContrastMode': 'defaltMode', 'cursorStatus': 'off', '_jc_save_toDate': '2024-04-30', } self.headers = { 'Accept': '*/*', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'If-Modified-Since': '0', 'Pragma': 'no-cache', 'Referer': 'https://www.12306.cn/index/index.html', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0', 'X-Requested-With': 'XMLHttpRequest', } self.params = { "leftTicketDTO.train_date": date, "leftTicketDTO.from_station": begin_id, "leftTicketDTO.to_station": end_id, "purpose_codes": "ADULT" } self.pt = PrettyTable()
def run(self): res = requests.get( self.url, headers=self.headers, params=self.params, cookies=self.cookies ).json() data_list = res['data']['result'] header_list = [ ['车次', '出发时间', '到达时间', '历时', '商务座', '一等座', '二等座', '软卧', '硬卧', '硬座', '无座', '备注'] ] self.pt.field_names = header_list[0] for data in data_list: trains_msg = self.format_data(data) header_list.append(trains_msg) print(self.pt) return header_list
def format_data(self, data): all_data_list = data.split('|') trains_msg = [ all_data_list[3], all_data_list[8], all_data_list[9], all_data_list[10], all_data_list[32] if all_data_list[32] != "" else "--", all_data_list[31] if all_data_list[31] != "" else "--", all_data_list[30] if all_data_list[30] != "" else "--", all_data_list[23] if all_data_list[23] != "" else "--", all_data_list[28] if all_data_list[28] != "" else "--", all_data_list[29] if all_data_list[29] != "" else "--", all_data_list[26] if all_data_list[26] != "" else "--", all_data_list[1] if all_data_list[1] != "" else "--" ] self.pt.add_row(trains_msg) return trains_msg
def save_data(self, trains_data_list, date, begin, end): num = input("如果展示不清晰,需要保存时请扣1:") if num == "1": wb = Workbook() sheet = wb.create_sheet("车次信息", -1) for x in range(len(trains_data_list)): for y in range(len(trains_data_list[x])): sheet.cell(x + 1, y + 1).value = trains_data_list[x][y] wb.save(f"{date}_{begin}_{end}.xlsx") print("数据保存完成!")
if __name__ == '__main__': date = input("请输入出发日期(YYYY-MM-DD):") begin = input("请输入出发地:") end = input("请输入目的地:") city_list = json.load(open('city_data.json', 'r')) begin_id = city_list[begin] end_id = city_list[end] gt = GetTrains(date, begin_id, end_id) trains_data_list = gt.run() gt.save_data(trains_data_list, date, begin, end) print( "12306直达链接(复制到浏览器打开):", "https://kyfw.12306.cn/otn/leftTicket/init?" "linktypeid=dc&" f"fs={begin},{begin_id}&" f"ts={end},{end_id}&" f"date={date}&" "flag=N,N,Y" )
|