python php 12306 獲取數(shù)據(jù)

# 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實現(xiàn)該功能的版本

<?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);
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亮钦,一起剝皮案震驚了整個濱河市薄嫡,隨后出現(xiàn)的幾起案子番刊,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡圾浅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門憾朴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狸捕,“玉大人,你說我怎么就攤上這事众雷【呐模” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵砾省,是天一觀的道長鸡岗。 經(jīng)常有香客問我,道長编兄,這世上最難降的妖魔是什么轩性? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮狠鸳,結(jié)果婚禮上揣苏,老公的妹妹穿的比我還像新娘悯嗓。我一直安慰自己,他們只是感情好卸察,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布脯厨。 她就那樣靜靜地躺著,像睡著了一般坑质。 火紅的嫁衣襯著肌膚如雪合武。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天涡扼,我揣著相機與錄音稼跳,去河邊找鬼。 笑死吃沪,一個胖子當著我的面吹牛岂贩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巷波,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卸伞!你這毒婦竟也來了抹镊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤荤傲,失蹤者是張志新(化名)和其女友劉穎垮耳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂黍,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡终佛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雾家。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铃彰。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芯咧,靈堂內(nèi)的尸體忽然破棺而出牙捉,到底是詐尸還是另有隱情,我是刑警寧澤敬飒,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布邪铲,位于F島的核電站,受9級特大地震影響无拗,放射性物質(zhì)發(fā)生泄漏带到。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一英染、第九天 我趴在偏房一處隱蔽的房頂上張望揽惹。 院中可真熱鬧被饿,春花似錦、人聲如沸永丝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慕嚷。三九已至哥牍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喝检,已是汗流浹背嗅辣。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挠说,地道東北人澡谭。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像损俭,于是被迫代替她去往敵國和親蛙奖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容