Beispiel #1
0
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
Beispiel #2
0
 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)
Beispiel #3
0
 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
Beispiel #4
0
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)
Beispiel #5
0
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")
Beispiel #6
0
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)
Beispiel #7
0
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")
Beispiel #8
0
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())
Beispiel #9
0
    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
Beispiel #10
0
# _*_ 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()))
Beispiel #12
0
def get_keys(value):
    t = list(stations.keys())
    for i in t:
        if stations[i] == value:
            return i
Beispiel #13
0
 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