def get_from_to_station_names(data_list): from_station_code = data_list[6] to_station_code = data_list[7] return '\n'.join([ stations.get_name(from_station_code), stations.get_name(to_station_code) ])
def get_from_to_station_name(self, data_list): from_station_telecode = data_list[6] to_station_telecode = data_list[7] return '\n'.join([ self.colored('green', stations.get_name(from_station_telecode)), self.colored('red', stations.get_name(to_station_telecode)) ])
def parse_train_data(data_list): train_code = data_list[3] from_station_name = stations.get_name(data_list[6]) to_station_name = stations.get_name(data_list[7]) start_time = data_list[8] arrive_time = data_list[9] time_duration = data_list[10] business_class_seat = data_list[32] or data_list[25] or '--' first_class_seat = data_list[31] or '--' second_class_seat = data_list[30] or '--' senior_soft_sleep = data_list[21] or '--' soft_sleep = data_list[23] or '--' move_seat = data_list[33] or '--' # 动卧 hard_sleep = data_list[28] or '--' soft_seat = data_list[24] or '--' hard_seat = data_list[29] or '--' no_seat = data_list[26] or '--' other = data_list[22] or '--' is_support_card = int(data_list[18] or 0) return [ train_code, from_station_name, to_station_name, start_time, arrive_time, time_duration, business_class_seat, first_class_seat, second_class_seat, senior_soft_sleep, soft_sleep, move_seat, hard_sleep, soft_seat, hard_seat, no_seat, other, is_support_card ]
def cli(): arguments = docopt(__doc__, version='tickets 1.0') from_station = stations.get_telecode(arguments.get('<from>')) to_station = stations.get_telecode(arguments.get('<to>')) date = arguments.get('<date>') options = ''.join( [key for key, value in arguments.items() if value is True]) url = ('https://kyfw.12306.cn/otn/leftTicket/query?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(date, from_station, to_station) r = requests.get(url, verify=False) raw_trains = r.json()['data']['result'] x = PrettyTable() x._set_field_names([ '车次', '出发车站/到达车站', '始发车站/到达车站', '时间', '历时', '商务座', '一等座', '二等座', '高级软卧', '软卧', '动卧', '硬卧', '软座', '硬座', '无座' ]) for raw_train in raw_trains: data_list = raw_train.split('|') train_no = data_list[3] initial = train_no[0].lower() from_station_code = data_list[4] to_station_code = data_list[5] from_station_u = data_list[6] to_station_u = data_list[7] start_time = data_list[8] arrive_time = data_list[9] duration = data_list[10] swz = data_list[32] or '--' first = data_list[31] or '--' second = data_list[30] or '--' gaojirw = data_list[21] or '--' ruanw = data_list[23] or '--' yingw = data_list[28] or '--' dongwo = data_list[33] or '--' ruanz = data_list[24] or '--' yingz = data_list[29] or '--' wuzuo = data_list[26] or '--' if initial in options: x.add_row([ train_no, '\n'.join([ Fore.GREEN + stations.get_name(from_station_u) + Fore.RESET, Fore.RED + stations.get_name(to_station_u) + Fore.RESET ]), '\n'.join([ Fore.GREEN + stations.get_name(from_station_code) + Fore.RESET, Fore.RED + stations.get_name(to_station_code) + Fore.RESET ]), '\n'.join([ Fore.GREEN + start_time + Fore.RESET, Fore.RED + arrive_time + Fore.RESET ]), duration, swz, first, second, gaojirw, ruanw, yingw, dongwo, ruanz, yingz, wuzuo ]) print(x)
def cli(): arguments = docopt(__doc__, version='tickets 1.0') from_station = stations.get_telecode(arguments.get('<from>')) to_station = stations.get_telecode(arguments.get('<to>')) date = arguments.get('<date>') options = ''.join( [key for key, value in arguments.items() if value is True]) url = ('https://kyfw.12306.cn/otn/leftTicket/query?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(date, from_station, to_station) r = requests.get(url, verify=False) raw_trains = r.json()['data']['result'] pt = PrettyTable() pt._set_field_names( '车次 车站 时间 历时 商务座 一等座 二等座 高级软卧 软卧 动卧 硬卧 软座 硬座 无座'.split()) for raw_train in raw_trains: data_list = raw_train.split('|') train_no = (data_list[3]) #车次 initial = train_no[0].lower() if initial in options or not options: from_station_code = (data_list[6]) to_station_code = (data_list[7]) from_station_name = '' to_station_name = '' start_time = data_list[8] arrive_time = data_list[9] time_duration = data_list[10] normal_seat = data_list[32] or '--' first_class_seat = data_list[31] or '--' second_class_seat = data_list[30] or '--' ssoft_sleep = data_list[21] or '--' soft_sleep = data_list[23] or '--' #为空显示-- move_sleep = data_list[33] or '--' hard_sleep = data_list[28] or '--' soft_seat = data_list[24] or '--' hard_seat = data_list[29] or '--' no_seat = data_list[26] or '--' #显示 pt.add_row([ ''.join([Fore.RED + train_no + Fore.RESET]), '\n'.join([ Fore.GREEN + stations.get_name(from_station_code) + Fore.RESET, Fore.YELLOW + stations.get_name(to_station_code) + Fore.RESET ]), '\n'.join([ Fore.GREEN + start_time + Fore.RESET, Fore.YELLOW + arrive_time + Fore.RESET ]), time_duration, normal_seat, first_class_seat, second_class_seat, ssoft_sleep, soft_sleep, move_sleep, hard_sleep, soft_seat, hard_seat, no_seat ]) return pt
def cli(): arguments = docopt(__doc__, version='tickets 1.0') from_station = stations.get_telecode(arguments.get('<from>')) to_station = stations.get_telecode(arguments.get('<to>')) date = arguments.get('<date>') options = ''.join( [key for key, value in arguments.items() if value is True]) url = ('https://kyfw.12306.cn/otn/leftTicket/query?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(date, from_station, to_station) r = requests.get(url, verify=False) #print(arguments) #print(r.text) raw_trains = r.json()['data']['result'] #print(trains) pt = PrettyTable() pt._set_field_names('车次 车站 时间 历时 一等座 二等座 软卧 硬卧 硬座 无座'.split()) for raw_trains in raw_trains: data_list = raw_trains.split('|') #print(data_list[2]) train_no = data_list[3] initial = train_no[0].lower() if not options or initial in options: from_station_code = data_list[6] to_station_code = data_list[7] from_station_name = '' to_station_name = '' start_time = data_list[8] arrive_time = data_list[9] time_duration = data_list[10] first_class_seat = data_list[31] or "--" secong_class_seat = data_list[30] or "--" soft_sleep = data_list[23] or "--" hard_sleep = data_list[28] or "--" hard_seat = data_list[29] or "--" no_seat = data_list[33] or "--" pt.add_row([ train_no, '\n'.join([ stations.get_name(from_station_code), stations.get_name(to_station_code) ]), '\n'.join([start_time, arrive_time]), time_duration, first_class_seat, secong_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat ]) print(pt)
def cli(): """Command-Line Interface""" arguments = docopt(__doc__, version='Tickets 1.0') date = arguments['<date>'] from_station = stations.get_telecode( arguments['<from>']) # 从stations中获取,如果没有获取到返回None to_station = stations.get_telecode(arguments['<to>']) # 构建 url url = ('https://kyfw.12306.cn/otn/leftTicket/queryZ?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(date, from_station, to_station) r = requests.get(url, verify=False) row_trains = r.json()['data']['result'] pt = PrettyTable() pt._set_field_names('车次 车站 时间 历时 一等座 二等座 软卧 硬卧 硬座 无座'.split()) for row_train in row_trains: data_list = row_train.split('|') train_no = data_list[3] from_station_code = data_list[6] to_station_code = data_list[7] from_station_name = '' to_station_name = '' start_time = data_list[8] arrive_time = data_list[9] time_duration = data_list[10] first_class_seat = data_list[31] or '--' second_class_seat = data_list[30] or '--' soft_sleep = data_list[23] or '--' hard_sleep = data_list[28] or '--' hard_seat = data_list[29] or '--' no_seat = data_list[33] or '--' pt.add_row([ train_no, '\n'.join([ stations.get_name(from_station_code), stations.get_name(to_station_code) ]), '\n'.join([start_time, arrive_time]), time_duration, first_class_seat, second_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat ]) print(pt)
def cli(): arguments = docopt(__doc__, version='Tickets1.0') from_station = stations.get_telecode(arguments.get('<from>')) to_station = stations.get_telecode(arguments.get('<to>')) data = arguments.get('<data>') options = ''.join([key for key, values in arguments.items() if values is True]) url = 'https://kyfw.12306.cn/otn/leftTicket/query?' \ 'leftTicketDTO.train_date={}&' \ 'leftTicketDTO.from_station={}&' \ 'leftTicketDTO.to_station={}&' \ 'purpose_codes=ADULT'.format(data, from_station, to_station) header = '车次 车站 时间 历时 商务座 一等 二等 软卧 硬卧 硬座 无座'.split() pt = PrettyTable() pt._set_field_names(header) # 获取接口 res = requests.get(url, verify=False) raw_data = res.json()['data']['result'] for data in raw_data: data_list = data.split('|') train_no = data_list[3] train_sort = train_no[0].lower() if not options or train_sort in options: from_station_name = data_list[6] to_station_name = data_list[7] start_time = data_list[8] arrive_time = data_list[9] cost_time = data_list[10] business_seat = data_list[32] or '--' first_class_seat = data_list[31] or '--' second_class_seat = data_list[30] or '--' soft_sleep = data_list[23] or '--' hard_sleep = data_list[28] or '--' hard_seat = data_list[29] or '--' no_seat = data_list[26] or '--' pt.add_row([ train_no, '\n'.join([Fore.GREEN + stations.get_name(from_station_name) + Fore.RESET, Fore.RED + stations.get_name(to_station_name) + Fore.RESET]), '\n'.join([Fore.GREEN + start_time + Fore.RESET, Fore.RED + arrive_time + Fore.RESET]), cost_time, business_seat, first_class_seat, second_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat ]) print(pt)
def initDc(self, date): # 请求订票信息 url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc' res = self.session.post(url, data={"_json_att": ""}).text tk = re.search(r'globalRepeatSubmitToken = \'(.+?)\'', res).group(1) leftTicketStr = re.search(r'\'leftTicketStr\':\'(.+?)\'', res).group(1) key_check_isChange = re.search(r'\'key_check_isChange\':\'(.+?)\'', res).group(1) leftTickets = re.findall(r"\w+num\':\'[1-9]\d*\'", res) if len(leftTickets) == 0: # 判断是否存在硬座 print('没票了,5秒后自动刷新') time.sleep(5) self.initDc(date) else: station_train_code = re.search(r'\'station_train_code\':\'(.+?)\'', res).group(1) # 车次 from_station = re.search(r'\'from_station\':\'(.+?)\'', res).group(1) # 出发地 to_station = re.search(r'\'to_station\':\'(.+?)\'', res).group(1) # 目的地 train_location = re.search(r'\'train_location\':\'(.+?)\'', res).group(1) train_no = re.search(r'\'train_no\':\'(.+?)\'', res).group(1) # 车次完整号码 start_time = re.search(r'\'start_time\':\'(.+?)\'', res).group(1) arrive_time = re.search(r'\'arrive_time\':\'(.+?)\'', res).group(1) users = self.getPassenger(tk) ticket_num = re.findall(r"\w+num\':\'[1-9]\d*\'", res) prices = re.findall(r"\w+price\':\'\d\d\d\d\d\'", res) t_file = [ station_train_code, stations.get_name(from_station), start_time, stations.get_name(to_station), arrive_time, ticket_num, prices, users, tk, leftTicketStr, from_station, to_station, train_location, train_no, key_check_isChange, date ] return t_file
def leadin(): #自定义将数据导入数据库的函数 conn = sqlite3.connect('12306.db') #建立与数据库的连接 cursor = conn.cursor() #使用游标进行操作 SQL1 = '''create table if not exists alldata(车次,日期,始发站,终点站,出发时间,到达时间,历时, 商务座,一等座,二等座,动卧,软卧,硬卧,硬座,无座,PRIMARY KEY(车次,日期))''' # SQL1语句在数据库内创建一张表(如果已经存在则不再创建),以车次,日期作为主键 cursor.execute(SQL1) #执行SQL1语句 conn.commit() #递交执行结果 for raw_train in raw_trains: #用循环将车次信息以列表导入数据库 data_list = raw_train.split('|') SQL2 = '''insert or replace into alldata (车次,日期,始发站,终点站,出发时间,到达时间,历时, 商务座,一等座,二等座,动卧,软卧,硬卧,硬座,无座) values('%s','%s','%s','%s','%s','%s','%s','%s', '%s','%s','%s','%s','%s','%s','%s')''' % ( data_list[3], date, stations.get_name( data_list[6]), stations.get_name( data_list[7]), data_list[8], data_list[9], data_list[10], data_list[32], data_list[31], data_list[30], data_list[33], data_list[23], data_list[28], data_list[29], data_list[26]) #以车次,日期为主键判断是否存在,不存在则插入,存在则更新 cursor.execute(SQL2) conn.commit() conn.close()
def cli(): """command-line interface""" arguments = docopt(__doc__, version='Tickets 1.0') from_station = stations.get_telecode(arguments.get('<from>')) to_station = stations.get_telecode(arguments.get('<to>')) train_date = arguments['<date>'] url = ('https://kyfw.12306.cn/otn/leftTicket/query?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(train_date,from_station,to_station) print(url) options = ''.join([ key for key,value in arguments.items() if value is True ]) r = requests.get(url,verify=False) raw_trains = r.json()['data']['result'] pt = PrettyTable() pt._set_field_names('车次 车站 时间 历时 一等 二等 软卧 硬卧 硬座 无座'.split()) for raw_train in raw_trains: data_list = raw_train.split('|') train_no = data_list[3] from_station_name = data_list[6] to_station_name = data_list[7] start_time = data_list[8] arrive_time = data_list[9] time_duration = data_list[10] first_class_seat = data_list[31] or '--' second_class_seat = data_list[30] or '--' soft_sleep = data_list[23] or '--' hard_sleep = data_list[28] or '--' hard_seat = data_list[29] or '--' no_seat = data_list[33] or '--' pt.add_row([ train_no, '\n'.join([Fore.LIGHTGREEN_EX + stations.get_name(from_station_name) + Fore.RESET,Fore.RED + stations.get_name(to_station_name) + Fore.RESET]), '\n'.join([Fore.LIGHTGREEN_EX + start_time + Fore.RESET,Fore.RED + arrive_time + Fore.RESET]), time_duration, first_class_seat, second_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat ]) print(pt)
def tickets(entry2, entry3, entry4, entry5): global date str = entry2.get() #请输入出发站 str1 = entry3.get() #请输入到达站 date = entry4.get() #请输入出发日期(格式xxxx-xx-xx) options = entry5.get() #请输入列车类型(格式g、d、t、k、z) #获取地名对应的简写代码 from_station = stations.station[str] to_station = stations.station[str1] # 例如:https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2020-06-19&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT #对url进行分析,拿到正确的url url = ('https://kyfw.12306.cn/otn/leftTicket/query?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(date, from_station, to_station) #设置headers headers = { "Cookie": "tk=-tIp2gt3OFnd85DwD1ZPefIm_hqqr_fZ4R8LmgtyT1T0; JSESSIONID=8C879BE703110108760AB7B06D189E4C; _jc_save_wfdc_flag=dc; ten_key=XHg9EqyTtYQzWSFbtdFVvi/EYPgxHIlZ; ten_js_key=XHg9EqyTtYQzWSFbtdFVvi%2FEYPgxHIlZ; ten_join_key=XHg9EqyTtYQzWSFbtdFVvi%2FEYPgxHIlZ%2CXHg9EqyTtYQzWSFbtdFVvi%2FEYPgxHIlZ; _jc_save_toStation=%u4E0A%u6D77%2CSHH; RAIL_EXPIRATION=1592636846009; RAIL_DEVICEID=VBzKZAfI0UiD-1Yb5clAfVIDbU7xbTVZh1yYP4d0A67zrJm_cXcZICUuM4ybvuqHzkOzcI9eCiAaF8VEetB7JdRw6K0UBo1duL5H_CO4KRFq4qqnM4pS3BBgxrAdrY4gadfZ3I5JO8ZXq17sk8UJ2PkpVMizthOp; BIGipServerpassport=988283146.50215.0000; route=6f50b51faa11b987e576cdb301e545c4; _jc_save_toDate=2020-06-19; BIGipServerpool_passport=283968010.50215.0000; BIGipServerotn=921698826.24610.0000; _jc_save_fromStation=%u5357%u4EAC%u5357%2CNKH; _jc_save_fromDate=2020-06-20" } r = requests.get(url, headers=headers, verify=False) r = r.text # requests得到的是一个json格式的对象,利用json转化成python字典格式数据来提取 j = json.loads(r) global raw_trains #定义全局变量,在导入数据库函数中使用 raw_trains = j['data']['result'] #提取J中的“data”和“result”数据 x = PrettyTable() x._set_field_names( '车次 车站 时间 历时 商务座 一等座 二等座 动卧 软卧 硬卧 硬座 无座'.split()) #得到信息的列表 for raw_train in raw_trains: data_list = raw_train.split('|') #由于在raw_train 中分隔符为“|”,故用此将信息隔开 train_number = data_list[3] #获取列车编号 initial = train_number[0].lower( ) #由于在raw_train 中列车类型首字母均为大写,例如“G5”,为了和开始我们的信息的填写相对应,我们这里进行大小写转换 if not options or initial in options: #如果没有options(此时不做判断全部输出) 或者 列车首字母小写在options内则输出 #获取对应信息 from_station_code = data_list[6] #出发站简写代码 to_station_code = data_list[7] #终点站简写代码 from_station_name = '' #这里给它设置为空值,后面用简写代码加上 to_station_name = '' start_time = data_list[8] #出发时间 arrive_time = data_list[9] #到达时间 time_duration = data_list[10] #历时 business_seat = data_list[32] or '--' #商务座,如果数据为空返回“--” first_class_seat = data_list[31] or '--' #一等座 second_class_seat = data_list[30] or '--' #二等座 pneumatic_sleep = data_list[33] or '--' #动卧 soft_sleep = data_list[23] or '--' #软卧 hard_sleep = data_list[28] or '--' #硬卧 hard_seat = data_list[29] or '--' #硬座 no_seat = data_list[26] or '--' #无座 x.add_row([ train_number, '\n'.join([ stations.get_name(from_station_code), stations.get_name(to_station_code) ]), #把站名放在一起 '\n'.join([start_time, arrive_time]), #把发车时间和到达时间放在一起 time_duration, business_seat, first_class_seat, second_class_seat, pneumatic_sleep, soft_sleep, hard_sleep, hard_seat, no_seat ]) #利用prettytable美化一下,使之输出为表格形式 #这里用tkinter展示 global root root = Tk() root.geometry("800x600") root.title("列车时刻表") text = Text(root, width=800, height=500) btn1 = Button(root, text='导入数据库', command=leadin) #按钮一将数据导入数据库 btn2 = Button(root, text='到库内查询', command=SS) #按钮二执行自定义SS函数 text.place(relx=0, relwidth=0.9, rely=0, relheight=1) btn1.place(relx=0.9, relwidth=0.1, rely=0.4, relheight=0.2) btn2.place(relx=0.9, relwidth=0.1, rely=0.6, relheight=0.2) text.insert(INSERT, x) root.mainloop()
def cli(): arguments = docopt(__doc__, version='Tickets 1.0') #實例化命令行參數 from_station = stations.get_code(arguments.get("<from>")) #得到命令行輸入起始站的編號 to_station = stations.get_code(arguments.get("<to>")) #得到命令行輸入終點站編號 date = arguments.get("<date>") #得到輸入日期 url = ( "https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT" ).format(date, from_station, to_station) #將上述參數放進 url try: r = requests.get( url, verify=False, timeout=100, headers={ "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" }, allow_redirects=False) #請求 url r.raise_for_status() except: print("error!") raw_trains = r.json()["data"]["result"] #將json數據改爲列表 #設定prettytable格式 x = pt("車次 起始站/終點站 發車時刻/行車時間 歷時 一等座 二等坐 軟臥 硬臥 硬座 無坐".split(" ")) x.align[""] = "|" x.padding_width = 1 #從 json文件中解析數據 for raw_train in raw_trains: data_list = raw_train.split("|") train_number = data_list[3] from_station_code = data_list[6] to_station_code = data_list[7] start_time = data_list[8] arrive_time = data_list[9] time_duration = data_list[10] first_seat = data_list[31] or "--" second_seat = data_list[30] or "--" soft_bed = data_list[23] or "--" hard_bed = data_list[28] or "--" hard_seat = data_list[29] or "--" no_seat = data_list[33] or "--" #向 prettytable 中填充數據 x.add_row([ Fore.BLUE + train_number + Fore.RESET, "\n".join([ Fore.GREEN + stations.get_name(from_station_code) + Fore.RESET, Fore.RED + stations.get_name(to_station_code) + Fore.RESET ]), "\n".join([ Fore.GREEN + start_time + Fore.RESET, Fore.RED + arrive_time + Fore.RESET ]), time_duration, Fore.YELLOW + first_seat, second_seat, soft_bed, hard_bed, hard_seat, no_seat + Fore.RESET ]) print(x)
def cli(): arguments = docopt(__doc__)#用docopt来解析参数 from_station=stations.get_telecode(arguments.get('<from>')) to_station=stations.get_telecode(arguments.get('<to>')) date=arguments.get('<date>') options=''.join([key for key,value in arguments.items() if value is True]) #构造请求地址 url=('https://kyfw.12306.cn/otn/leftTicket/queryZ?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(date,from_station,to_station) r=requests.get(url,verify=False,headers=headers) r.encoding=r.apparent_encoding if (r.text.find('网络可能存在问题') != -1): print('网络存在问题,请重试,可能是你访问的过于频繁!') exit() #requests里面自带了json解析器,所以我们可以用来解析python raw_trains=r.json()['data']['result'] #原始火车信息 pt=PrettyTable() #初始化一个prettytable对象 pt._set_field_names('车次 车站 时间 历时 商务座 一等座 二等座 高级软卧 软卧 动卧 硬卧 软座 硬座 无座'.split()) for raw_train in raw_trains: #对每一趟列车进行解析 data_list=raw_train.split('|') train_no=data_list[3] initial=train_no[0].lower() #获取首字母,表示车次 if not options or initial in options: #如果没有设置options或者首字母在options里面 from_station_code=data_list[6] to_station_code=data_list[7] start_time=data_list[8] #始发时间 arrive_time=data_list[9] #到达时间 time_duration=data_list[10] #历时 swz_class_seat = data_list[32] if data_list[32] else '--' # 商务座 first_class_seat=data_list[31] if data_list[31] else '--' #一等座 second_class_seat=data_list[30] if data_list[30] else '--' #二等座 gjrw_class_seat = data_list[21] if data_list[21] else '--' # 高级软卧 rw_class_seat = data_list[23] if data_list[23] else '--' # 软卧 dw_class_seat = data_list[27] if data_list[27] else '--' # 动卧 yw_class_seat = data_list[28] if data_list[28] else '--' # 硬卧 soft_seat = data_list[24] if data_list[24] else '--' #软座 hard_seat=data_list[29] if data_list[29] else '--' #硬座 no_seat=data_list[26] if data_list[26] else '--' #无座 pt.add_row([ Fore.YELLOW + train_no + Fore.RESET, '\n'.join([ Fore.GREEN + stations.get_name(from_station_code) + Fore.RESET, Fore.RED + stations.get_name(to_station_code) + Fore.RESET]), '\n'.join([ Fore.GREEN + start_time + Fore.RESET, Fore.RED + arrive_time + Fore.RESET]), time_duration, #历时 swz_class_seat, # 商务座 first_class_seat, #一等座 second_class_seat, #二等座 gjrw_class_seat, #高级软卧 rw_class_seat, #软卧 dw_class_seat, #动卧 yw_class_seat, #硬卧 soft_seat, #软座 hard_seat, #硬座 no_seat]) #无座 print(pt)
def cli(): argv_len = len(sys.argv) print(argv_len) if argv_len != 4 and argv_len != 5: print(__doc__) return None print('searching ticket.....') #arguments = docopt(__doc__,version='ticket 1.0') #print(arguments) if 4 == argv_len: from_station = stations.get_telecode(sys.argv[1]) to_station = stations.get_telecode(sys.argv[2]) date = sys.argv[3] options = None else: from_station = stations.get_telecode(sys.argv[2]) to_station = stations.get_telecode(sys.argv[3]) date = sys.argv[4] options = sys.argv[1] #list(sys.argv[1])[1:] #print(options, type(options)) #print(not options or 'd' in options) # 列表推导式,得到的是查询车次类型的集合 #options = None#''.join([key for key,value in arguments.items() if value is True]) #print(options) url = ('https://kyfw.12306.cn/otn/leftTicket/query?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes=ADULT').format(date,from_station,to_station) print(url) r = requests.get(url, verify=False) #print(r.json()) # requests得到的是一个json格式的对象,r.json()转化成python字典格式数据来提取,所有的车次结果result raw_trains = r.json()['data']['result'] #print(raw_trains) pt = PrettyTable() pt._set_field_names("车次 车站 始终 时间 经历时 一等座 二等座 软卧 硬卧 硬座 无座".split()) for raw_train in raw_trains: # split切割之后得到的是一个列表 #print(raw_train) data_list = raw_train.split("|") #print(data_list[3:]) train_no = data_list[3] initial = train_no[0].lower() #print(initial, type(initial),not options or initial in options) # 判断是否是查询特定车次的信息 if not options or initial in options: begin_station_code = data_list[4] end_station_code = data_list[5] from_station_code = data_list[6] to_station_code = data_list[7] from_station_name = '' to_station_name = '' begin_station_name = '' end_station_name = '' start_time = data_list[8] arrive_time = data_list[9] time_duration = data_list[10] first_class_seat = data_list[31] or "--" second_class_seat = data_list[30] or "--" soft_sleep = data_list[23] or "--" hard_sleep = data_list[28] or "--" hard_seat = data_list[29] or "--" no_seat = data_list[33] or "--" pt.add_row([ # 对特定文字添加颜色 train_no, '\n'.join([stations.get_name(from_station_code), stations.get_name(to_station_code)]), '\n'.join([stations.get_name(begin_station_code), stations.get_name(end_station_code)]), '\n'.join([start_time, arrive_time]), #'\n'.join([Fore.GREEN + stations.get_name(from_station_code) + Fore.RESET, Fore.RED + stations.get_name(to_station_code) + Fore.RESET]), #'\n'.join([Fore.GREEN + start_time + Fore.RESET,Fore.RED + arrive_time + Fore.RESET]), time_duration, first_class_seat, second_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat ]) print(pt)