def chu(lis, options): #处理json数据的result对应的列表 trains = [] for l in lis: #列表的每一项为字符串 ll = l.split('|') #得到新的列表 每一项的对应关系在duiying.py中注明 train_no = ll[3] train_type = train_no[0].lower() #获取火车 k t from_station = ll[6] to_station = ll[7] #获取的json格式的数据中,所有出发站与到达站都是编码格式的,不是直接的中文,需要在stations反 #查找出对应的城市名 from_name = list(stations.keys())[list( stations.values()).index(from_station)] to_name = list(stations.keys())[list( stations.values()).index(to_station)] start_time = ll[8] end_time = ll[9] lishi = ll[10] for x in range(23, 33): if ll[x] == None: ll[x] = '--' if not options or train_type in options: train = [ train_no, '\n'.join([ Fore.GREEN + from_name + Fore.RESET, Fore.RED + to_name + Fore.RESET ]), '\n'.join([ Fore.GREEN + start_time + Fore.RESET, Fore.RED + end_time + Fore.RESET ]), lishi, ll[32], ll[31], ll[30], ll[23], ll[28], ll[29], ll[26], ] trains.append(train) return trains
def pretty_print(self): pt = PrettyTable() pt._set_field_names(self.header) #将站点的英文缩写转换为中文输出 for train in self.trains: for i in range(1, 5): train[i] = list(stations.keys())[list(stations.values()).index( train[i])] pt.add_row(train) print(pt)
def trains(self): for raw_train in self.available_trains: train_no = raw_train[3] initial = train_no[0].lower() if not self.options or initial in self.options: train = [ train_no, '\n'.join([ Fore.GREEN + list(stations.keys())[list( stations.values()).index(raw_train[4])] + Fore.RESET, Fore.RED + list(stations.keys())[list( stations.values()).index(raw_train[5])] + Fore.RESET ]), '\n'.join([ Fore.GREEN + list(stations.keys())[list( stations.values()).index(raw_train[6])] + Fore.RESET, Fore.RED + list(stations.keys())[list( stations.values()).index(raw_train[7])] + Fore.RESET ]), '\n'.join([ Fore.GREEN + raw_train[8] + Fore.RESET, Fore.RED + raw_train[9] + Fore.RESET ]), '\n'.join([raw_train[10], raw_train[11]]), # self._get_duration(raw_train), raw_train[33], raw_train[31], raw_train[30], raw_train[22], raw_train[23], raw_train[26], raw_train[27], raw_train[28], raw_train[29] ] yield train
def dbview(N=100): """ View the contents of the database """ dbsize = redis.dbsize() keys = stations.keys() data = [] for i in range(N): a = "lds" b = random.choice(keys) key = "{}:{}".format(a, b) allips = redis.zrange(key, 0, -1, withscores=True) allips = [(ip, arrow.get(time).humanize()) for ip, time in allips] data.append((stations[a], stations[b], allips)) return render_template("dbview.html", dbsize=dbsize, keys=data)
def populate(N=10000): """ Prepopulate the database """ keys = stations.keys() now = arrow.now() p = redis.pipeline() for i in range(N): a = "lds" b = random.choice(keys) key = "{}:{}".format(a, b) ip = random.randint(0, 100) start_time = now.replace(minutes=random.randint(0, 1000)).timestamp p.zadd(key, start_time, ip) p.execute() return redirect("/dbview")
def populate(N = 10000): """ Prepopulate the database """ keys = stations.keys() now = arrow.now() p = redis.pipeline() for i in range(N): a = "lds" b = random.choice(keys) key = "{}:{}".format(a, b) ip = random.randint(0, 100) start_time = now.replace(minutes = random.randint(0, 1000)).timestamp p.zadd(key, start_time, ip) p.execute() return redirect("/dbview")
def scrape_date(date, db_sess, requests_sess): log = structlog.get_logger(date=unparse_date(date)) URL_TEMPLATE = "http://serviceadvisory.nyc/api/stop/{station}{direction}/{date}" for code in stations.keys(): log = log.bind(station=code) for direction in ["N", "S"]: log.info("Scraping") resp = requests_sess.get( URL_TEMPLATE.format(station=code, direction=direction, date=unparse_date(date))) # TODO better error handling? resp.raise_for_status() save_to_db(log, db_sess, resp.json())
def trains(self): # 获取每一条数据 for raw_train in self.available_trains: # 将数据按|分隔 raw_train = raw_train.split('|') # 获取数组中第4列数据 train_no = raw_train[3] # 获取车次对应第一个字母 initial = train_no[0].lower() # 反转station所对应的字典 station_re = dict(zip(stations.values(), stations.keys())) # 如果没有参数或查询车次首字母在opthons中才会显示 if not self.options or initial in self.options: # 分别获取车次始发、终点、查询开始站、查询到达站 begin_station = station_re.get(raw_train[4]) end_station = station_re.get(raw_train[5]) from_station = station_re.get(raw_train[6]) to_station = station_re.get(raw_train[7]) # 判断是否为始发、终止、过 begin_flag = self.check_equals(begin_station, end_station, from_station) end_flag = self.check_equals(begin_station, end_station, to_station) # 将数据拼接 train = [ train_no, '\n'.join([ Fore.GREEN + begin_flag + ' ' + str(from_station) + Fore.RESET, Fore.RED + end_flag + ' ' + str(to_station) + Fore.RESET ]), '\n'.join([ Fore.GREEN + raw_train[8] + Fore.RESET, Fore.RED + raw_train[9] + Fore.RESET ]), self.get_duration(raw_train), # 如果查询到数据不为空就使用否则就是-- # 商务座、特等座 raw_train[32] if raw_train[32] != "" else "--", # 一等座 raw_train[31] if raw_train[31] != "" else "--", # 二等座 raw_train[30] if raw_train[30] != "" else "--", # 高级软卧 raw_train[21] if raw_train[21] != "" else "--", # 软卧 raw_train[23] if raw_train[23] != "" else "--", # 动卧 raw_train[33] if raw_train[33] != "" else "--", # 硬卧 raw_train[28] if raw_train[28] != "" else "--", # 软座 raw_train[24] if raw_train[24] != "" else "--", # 硬座 raw_train[29] if raw_train[29] != "" else "--", # 无座 raw_train[26] if raw_train[26] != "" else "--", # 其它 raw_train[22] if raw_train[22] != "" else "--", ] yield train
# _*_ coding:utf-8 _*_ __author__ = "lvhaidong" __modifier__ = "jinhuiphy" from prettytable import PrettyTable from stations import stations # 将stations的字典key和value调转,方便根据代码得到中文地址 stations = dict(zip(stations.values(), stations.keys())) # 拿到对应的火车票进行显示 class TrainTicket(object): """docstring for TrainTicket""" def __init__(self, rows): self.rows = rows self.header = '车次 出发/到达站 出发/到达时间 历时(H/M) 商务座 一等座 二等座 高级软卧 软卧 动卧 硬卧 软座 硬座 无座 其他'.split( ) # 查看运行的时间 def __get_duration(self, row): if row[9] == "99:59": return "--" duration = row[9].replace(':', '小时') + "分" # 如果是不足一小时的,应该是去掉前面的4位, 只剩下分钟数,例如00H:25M 武清->北京 if duration.startswith('00'): return duration[4:] # 当大于1小时的,就从第一位取值,显示小时数 elif duration.startswith('0'):
def __init__(self): self.stations_re = dict(zip(stations.values(), stations.keys()))
def get_keys(value): t = list(stations.keys()) for i in t: if stations[i] == value: return i
def trains(self): for raw_train in self.available_trains: # 列车号 train_no = raw_train[3] # 得到什么列车并小写 initial = train_no[0].lower() # 反转station所对应的字典 stations_re = dict(zip(stations.values(), stations.keys())) if not self.options or initial in self.options: # 将车次的信息保存到列表中 # train 出发地 begin_station = stations_re.get(raw_train[4]) # train 目的地 end_station = stations_re.get(raw_train[5]) # your 出发地 from_station = stations_re.get(raw_train[6]) # your 目的地 to_station = stations_re.get(raw_train[7]) # 判断是起始还是经过 begin_flag = self.__check_equals(begin_station, from_station) end_flag = self.__check_equals(end_station, to_station) train = [ train_no, '\n'.join([ begin_flag + ' ' + self.__get_color(Fore.GREEN, from_station), end_flag + ' ' + self.__get_color(Fore.RED, to_station) ]), '\n'.join([ self.__get_color(Fore.GREEN, raw_train[8]), self.__get_color(Fore.RED, raw_train[9]) ]), # 时间 self.get_duration(raw_train), # 历时 raw_train[32], # 特等座 self.__show_color(raw_train[31]), # 一等 self.__show_color(raw_train[30]), # 二等 self.__show_color(raw_train[22]), # 高级软卧 self.__show_color(raw_train[23]), # 软卧 self.__show_color(raw_train[33]), # 硬卧 self.__show_color(raw_train[28]), # 软座 self.__show_color(raw_train[24]), # 硬座 self.__show_color(raw_train[29]), # 无座 self.__show_color(raw_train[26]), # 备注 self.__show_color(raw_train[1]) ] # 更改不运行车次的时间和历时 if raw_train[14] == 'null': train[2] = '--\n--' train[3] = '--' # 将空字符串转化为‘--’ for i, item in enumerate(train): if not item: train[i] = '--' yield train