python php 12306 获取数据

# coding: utf-8

"""
Usage:
    ticket <from> <to> <date>
    
Options:
    -h, --help 查看帮助
"""

import requests
import re
from docopt import docopt
from prettytable import PrettyTable
from colorama import init, Fore

init()

url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9016'
response = requests.get(url, verify=False)
stations = dict(re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text))


class TrainsRow:
    header = '车次 车站 时间 历时 一等 二等 软卧 硬卧 硬座 无座'.split()

    def __init__(self, r, station):
        self.trains = r
        self.station = station

    @property
    def get_trains(self):
        trains = self.trains
        trains_show = []
        for train in trains:
            cm = train.split('|')
            cq = {}
            cq['train_no'] = cm[2]
            cq['station_train_code'] = cm[3]
            cq['start_station_telecode'] = cm[4]
            cq['end_station_telecode'] = cm[5]
            cq['from_station_telecode'] = cm[6]
            cq['to_station_telecode'] = cm[7]
            cq['start_time'] = cm[8]
            cq['arrive_time'] = cm[9]
            cq['lishi'] = cm[10]
            cq['canWebBuy'] = cm[11]
            cq['yp_info'] = cm[12]
            cq['start_train_date'] = cm[13]
            cq['train_seat_feature'] = cm[14]
            cq['location_code'] = cm[15]
            cq['from_station_no'] = cm[16]
            cq['to_station_no'] = cm[17]
            cq['is_support_card'] = cm[18]
            cq['controlled_train_flag'] = cm[19]
            cq['gg_num'] = cm[20] and cm[20] or '--'
            cq['gr_num'] = cm[21] and cm[21] or '--'
            cq['qt_num'] = cm[22] and cm[22] or '--'
            cq['rw_num'] = cm[23] and cm[23] or '--'
            cq['rz_num'] = cm[24] and cm[24] or '--'
            cq['tz_num'] = cm[25] and cm[25] or '--'
            cq['wz_num'] = cm[26] and cm[26] or '--'
            cq['yb_num'] = cm[27] and cm[27] or '--'
            cq['yw_num'] = cm[28] and cm[28] or '--'
            cq['yz_num'] = cm[29] and cm[29] or '--'
            cq['ze_num'] = cm[30] and cm[30] or '--'
            cq['zy_num'] = cm[31] and cm[31] or '--'
            cq['swz_num'] = cm[32] and cm[32] or '--'
            cq['srrb_num'] = cm[33] and cm[33] or '--'
            cq['yp_ex'] = cm[34]
            cq['seat_types'] = cm[35]
            trains_show.append(cq)

            train_show = [
                cq['station_train_code'],
                (Fore.RED + self.station[cq['from_station_telecode']] + Fore.RESET),
                cq['start_time'],
                cq['lishi'],
                cq['zy_num'],
                cq['ze_num'],
                cq['rw_num'],
                cq['yw_num'],
                cq['yz_num'],
                cq['wz_num'],
            ]
            train_time_show = [
                '',
                (Fore.GREEN + self.station[cq['to_station_telecode']] + Fore.RESET),
                cq['arrive_time'],
                '',
                '',
                '',
                '',
                '',
                '',
                '',
            ]
            yield train_show
            yield train_time_show

    def pretty_print(self):
        pt = PrettyTable()
        pt._set_field_names(self.header)
        for train in self.get_trains:
            pt.add_row(train)
        print(pt)


def cli():
    arguments = docopt(__doc__)
    date = arguments['<date>']
    from_address = stations.get(arguments['<from>'])
    to_address = stations.get(arguments['<to>'])

    url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
        date, from_address, to_address)

    r = requests.get(url, verify=False)
    result = r.json()['data']['result']
    station = r.json()['data']['map']

    TrainsRow(result, station).pretty_print()


if __name__ == '__main__':
    cli()

python3 ticket.py 大连 北京 2017-07-02 就可以 获取值啦

WechatIMG456.jpeg

下面是php实现该功能的版本

<?php
header("Content-Type: text/html; charset=utf-8");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9035");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$cityText = curl_exec($ch);
curl_close($ch);

preg_match_all('/([\x{4e00}-\x{9fa5}]+)\|([A-Z]+)/u', $cityText, $match);
$citysMap = array();

foreach ($match[0] as $city) {
  $cityMap = explode('|', $city);
  $citysMap[$cityMap[0]] = $cityMap[1];
}

$from = $argv[1];
$to = $argv[2];
$date = $argv[3];

if (array_key_exists($from, $citysMap) && array_key_exists($to, $citysMap)) {
  getData();
} else {
  echo '输入的地址不正确';
}


function getData()
{
  global $date, $from, $to, $citysMap;

  print_r($citysMap);

  $url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={$date}&leftTicketDTO.from_station={$citysMap[$from]}&leftTicketDTO.to_station={$citysMap[$to]}&purpose_codes=ADULT";

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  $data = json_decode(curl_exec($ch))->data->result;
  curl_close($ch);

  handleData($data);
//  print_r($data);
}

function handleData($data)
{
  $dataArray = array();
  foreach ($data as $item) {
    $itemArray = explode('|', $item);

    $data = array();

    $data['train_no'] = $itemArray[2];
    $data['station_train_code'] = $itemArray[3];
    $data['start_station_telecode'] = $itemArray[4];
    $data['end_station_telecode'] = $itemArray[5];
    $data['from_station_telecode'] = $itemArray[6];
    $data['to_station_telecode'] = $itemArray[7];
    $data['start_time'] = $itemArray[8];
    $data['arrive_time'] = $itemArray[9];
    $data['lishi'] = $itemArray[10];
    $data['canWebBuy'] = $itemArray[11];
    $data['yp_info'] = $itemArray[12];
    $data['start_train_date'] = $itemArray[13];
    $data['train_seat_feature'] = $itemArray[14];
    $data['location_code'] = $itemArray[15];
    $data['from_station_no'] = $itemArray[16];
    $data['to_station_no'] = $itemArray[17];
    $data['is_support_card'] = $itemArray[18];
    $data['controlled_train_flag'] = $itemArray[19];
    $data['gg_num'] = $itemArray[20] ? $itemArray[20] : '--';
    $data['gr_num'] = $itemArray[21] ? $itemArray[21] : '--';
    $data['qt_num'] = $itemArray[22] ? $itemArray[22] : '--';
    $data['rw_num'] = $itemArray[23] ? $itemArray[23] : '--';
    $data['rz_num'] = $itemArray[24] ? $itemArray[24] : '--';
    $data['tz_num'] = $itemArray[25] ? $itemArray[25] : '--';
    $data['wz_num'] = $itemArray[26] ? $itemArray[26] : '--';
    $data['yb_num'] = $itemArray[27] ? $itemArray[27] : '--';
    $data['yw_num'] = $itemArray[28] ? $itemArray[28] : '--';
    $data['yz_num'] = $itemArray[29] ? $itemArray[29] : '--';
    $data['ze_num'] = $itemArray[30] ? $itemArray[30] : '--';
    $data['zy_num'] = $itemArray[31] ? $itemArray[31] : '--';
    $data['swz_num'] = $itemArray[32] ? $itemArray[32] : '--';
    $data['srrb_num'] = $itemArray[33] ? $itemArray[33] : '--';
    $data['yp_ex'] = $itemArray[34];
    $data['seat_types'] = $itemArray[35];

    array_push($dataArray, $data);
  }

  print_r($dataArray);
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容