利用fiddler抓包,编写一个12306火车票查票程序
import requests import json import csv # 注意cookie值会过期,报错,请重新设置cookie headers = { 'Cookie': 'BIGipServerpool_index=821035530.43286.0000; RAIL_EXPIRATION=1572017654075; RAIL_DEVICEID=AdfXWpWAdOcsfqpZcp69z03jVG2YmLBqQF2VenNG5feRJSf0QS7WxtLeTWxrilU3rQGv03d74zyJVwZRYLEFV_kr2_Hn1fVGPjGaWh3ehYI3eZsJ9xfGB9K21c9jMKf04A8NnCrVXCptD2U7u9U_bb-XwC52ptaJ; route=6f50b51faa11b987e576cdb301e545c4; BIGipServerotn=904921610.38945.0000', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36' } class CheckTicket: def __init__(self, date, from_station, to_station, headers=None): self.date = date self.from_station = from_station self.to_station = to_station self.headers = headers self.station_data = {} # 获取所有车站信息 station = requests.get( "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9114", headers=self.headers) # print(station.text) station_str = station.text station_list = station_str.split("@")[1:] # 车站名与代号进行映射 for i in station_list: station_name = i.split("|")[1:3] self.station_data[station_name[0]] = station_name[1] # print(station_name) # print(station_list) print(self.station_data) def check_result(self): url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format( self.date, self.station_data[self.from_station], self.station_data[self.to_station]) res = requests.get(url, headers=self.headers) res.encoding = "utf-8" # print(res.text) data = json.loads(res.text) # print(data, type(data)) results = data["data"]["result"] print(results, len(results)) t_headers = ["车次", "上车站", "下车站", "出发时间", "到达时间", "耗时", "高级软卧", "软卧", "软座", "无座", "硬卧", "硬座", "二等座", "一等座", "商务座"] result_list = [] # 用来存储最终查询的结果(列车的所有信息) for result in results: # 对每辆列车的信息进行切割,再与t_headers进行关系映射 res_msg = result.split("|")[3:] for i in range(10): del res_msg[8] for i in range(6): del res_msg[-1] del res_msg[9] del res_msg[12] del res_msg[14] for i in range(2): del res_msg[1] for i in range(1, 3): # 通过字典的值,找到对应的键 key_list = list(self.station_data.keys()) value_index = list(self.station_data.values()).index(res_msg[i]) res_msg[i] = key_list[value_index] # 更改数据类型,添加到列表,统一写入 res_tuple = tuple(res_msg) result_list.append(res_tuple) print(res_msg) with open("check_ticket.csv", "w", encoding="gbk")as f: write = csv.writer(f) write.writerow(t_headers) write.writerows(result_list) if __name__ == "__main__": my_check = CheckTicket(date="2019-10-30", from_station="长沙", to_station="深圳", headers=headers) my_check.check_result()效果图