Yahoo!路線情報 乗換案内の検索(HTTP)と検索結果のパース
Project description
norikae
Yahoo!路線情報 の乗換案内を HTTP GET で取得し、経路一覧・各区間の列車・途中停車などをパースする 非公式 の Python パッケージです。ブラウザ(Playwright 等)は不要です。
- 取得: 検索結果ページ
/search/resultをクエリ付きで GET し、HTML を取得 - パース: 一覧(
ul#rsltlst)と、各ルートの詳細(div.routeDetail内の駅・列車・停車駅)
利用条件・著作権・禁止事項は Yahoo!路線情報 および 利用規約 等に従ってください。本パッケージは LY 社・ Val Laboratory による公式ツールではありません。
目次
- 機能一覧
- インストール
- コマンドライン(CLI)
- 出力例
- Python API
- 取得データの構造
- 検索 URL の仕組み(概要)
- 注意・制限
- トラブルシュート
- 開発・配布
- バージョン・作者・ライセンス
機能一覧
| 機能 | 説明 |
|---|---|
| 経路検索(HTTP) | 出発・到着・日時・経由などをクエリに載せて結果 HTML を取得 |
| 一覧パース | 各候補の発着時刻・所要・運賃・乗換回数など |
| 詳細パース | 区間ごとの列車名・番線・乗車位置・途中停車駅と時刻 |
| 出発日時 | 「今から N 分後」「HH:MM 指定(過去なら翌日)」 |
| CLI | norikae コマンド / python -m norikae |
インストール
PyPI から:
pip install norikae
依存パッケージは beautifulsoup4 のみ(標準ライブラリの urllib で HTTP)。
リポジトリをクローンして開発する場合:
git clone https://github.com/tikipiya/norikae.git
cd norikae
pip install -e .
インストール後、CLI が使えるか確認:
norikae --help
python -m norikae --help
コマンドライン(CLI)
基本形
norikae --from <出発> --to <到着> [オプション]
--from / -f と --to / -t は 必須 です。
オプション一覧
| オプション | 短縮 | 既定 | 説明 |
|---|---|---|---|
--from |
-f |
(必須) | 出発地(駅名・バス停名など。サイトの検索と同じ表記が安全) |
--to |
-t |
(必須) | 到着地 |
--via |
— | なし | 経由地。複数回指定すると via01, via02 … の順になる |
--minutes |
-m |
0 |
出発を 現在時刻から N 分後 にする |
--at |
— | なし | 出発時刻 HH:MM(例: 9:30, 14:05)。--minutes より優先。すでに過ぎた時刻なら 翌日 として解釈 |
--max-summary |
— | 5 |
一覧に表示する 候補ルート数(上から N 件) |
--max-detail |
— | 3 |
詳細テキストを出すルート数(format_verbose 相当) |
--no-departure-line |
— | オフ | 採用した出発日時の行を 表示しない |
--timeout |
— | 60 |
HTTP タイムアウト(秒) |
CLI の使用例
# 今から 30 分後に出発で検索
norikae --from 愛子 --to 南仙台 --minutes 30
# 当日(または翌日)9:30 発
norikae -f 東京 -t 新大阪 --at 9:30
# 経由: 名古屋(--via を複数回で経由2も可)
norikae -f 東京 -t 大阪 --via 名古屋
# 一覧だけ多め、詳細は 1 ルートだけ
norikae -f 愛子 -t 南仙台 --max-summary 10 --max-detail 1
# ヘルプ
python -m norikae --help
出力例
norikae -f 愛子 -t 南仙台 -m 0 などで得られる表示の一例です(環境・時刻により検索結果は変わります)。
title: 愛子から南仙台への乗換案内 - Yahoo!路線情報
1 05:30 → 06:09 39分 440 円 乗換: 1 回
2 05:55 → 06:36 41分 440 円 乗換: 1 回
3 06:32 → 07:11 39分 440 円 乗換: 1 回
【ルート 1】 route01
概要: 05:30 発→ 06:09 着 39分 (乗車 33分 )
乗換: 1 回 / IC優先: 440 円 / 22.9km
乗り換え通過駅: 仙台
--- 各区間(列車)---
[1] 愛子 → 仙台
時刻: 05:30 ~ 05:54 着 06:00 発
列車: JR仙山線 当駅始発 仙台行
乗り場: [発] 情報なし → [着] 7 番線
乗車位置:[4両] 前 中 / [6両] 前 中
途中停車 (7 駅):
- 05:34 陸前落合
- 05:37 葛岡
- 05:40 国見(宮城県)
- 05:42 東北福祉大前
- 05:45 北山(宮城県)
- 05:47 北仙台
- 05:50 東照宮
[2] 仙台 → 南仙台
時刻: 05:54 着 06:00 発 ~ 06:09
列車: JR東北本線 当駅始発 郡山行
乗り場: [発] 5 番線 → [着] 情報なし
途中停車 (2 駅):
- 06:04 長町
- 06:06 太子堂
【ルート 2】 route02
(以下、CLI の --max-detail により省略される場合あり)
先頭の title: 行はページの <title> に相当し、その下の 1 2 3 … 行は 候補一覧(RouteSummary)。【ルート N】 以降は 区間ごとの列車・停車駅(RouteDetail + TrainLeg)です。
Python API
高水準: search_transit_route
出発地・到着地に加え、次のいずれかで日時を決めて 一発で SearchResultData を返します。
departure=…datetimeを直接指定(これがあると他の日時指定は無視)- または
minutes_from_now/at_clock/now… 内部でresolve_departure_datetimeを使用
その他の検索条件は TransitSearchParams と同じキーワードを search_transit_route(..., vias=(...), time_search_type=...) のように渡せます。
from norikae import search_transit_route, SearchTimeType
data = search_transit_route(
"愛子",
"南仙台",
minutes_from_now=45,
)
data2 = search_transit_route(
"東京",
"新大阪",
at_clock="14:30",
)
data3 = search_transit_route(
"東京",
"大阪",
vias=("名古屋",),
)
for s in data.summaries:
print(s.index, s.time_line, s.fare_yen, s.transfers)
for d in data.details:
print(d.format_verbose())
for leg in d.legs:
print(leg.line_and_direction, leg.intermediate_stops)
中水準: TransitSearchParams + search_transit
日付・時刻を数値で完全に制御したい場合。
from norikae import TransitSearchParams, search_transit
params = TransitSearchParams(
from_station="東京",
to_station="新大阪",
year=2026,
month=4,
day=2,
hour=9,
minute=0,
vias=(), # または ("名古屋",)
)
data = search_transit(params, timeout=60.0)
datetime から組み立てる場合:
from norikae import TransitSearchParams, resolve_departure_datetime, search_transit
dep = resolve_departure_datetime(minutes_from_now=20)
params = TransitSearchParams.from_datetime(dep, "東京", "新大阪")
data = search_transit(params)
低水準: 生 HTML
URL の組み立て・GET・パースを自分で繋ぐ場合。
from norikae import (
build_search_result_url,
fetch_transit_search_html,
parse_search_result_html,
)
url = build_search_result_url(
"東京",
"新大阪",
year=2026,
month=4,
day=2,
hour=9,
minute=0,
)
html = fetch_transit_search_html(url)
data = parse_search_result_html(html)
主な公開シンボル(抜粋)
| 名前 | 種別 | 役割 |
|---|---|---|
search_transit_route |
関数 | 高水準検索 |
search_transit |
関数 | TransitSearchParams → パース済み結果 |
fetch_search_result |
関数 | パラメータから GET して HTML 文字列 |
fetch_transit_search_html |
関数 | 任意 URL の HTML |
parse_search_result_html |
関数 | HTML → SearchResultData |
build_search_result_url |
関数 | GET 用 URL(vias, extra_query 可) |
resolve_departure_datetime |
関数 | 相対分・at_clock から datetime |
TransitSearchParams |
データクラス | 検索クエリ一式 |
SearchResultData |
データクラス | パース結果のルート |
RouteSummary / RouteDetail / TrainLeg / IntermediateStop |
データクラス | 一覧・詳細・区間・停車駅 |
SearchTimeType / DisplaySort / WalkSpeed / TicketKind / SeatKind |
Enum | クエリの列挙値 |
DepartureTimeError |
例外 | at_clock 形式不正など |
取得データの構造
SearchResultData
| フィールド | 内容 |
|---|---|
page_title |
検索結果ページのタイトル文字列 |
summaries |
list[RouteSummary] 候補の一覧(画面上部のリスト) |
details |
list[RouteDetail] 各候補の詳細ブロック |
RouteSummary(一覧 1 行相当)
| フィールド | 内容 |
|---|---|
route_id |
例: route01 |
index |
ルート番号(整数) |
time_line |
発着・所要などの要約テキスト |
fare_yen |
運賃表示のテキスト |
transfers |
乗換回数などのテキスト |
RouteDetail(詳細 1 ブロック)
| フィールド | 内容 |
|---|---|
route_anchor |
route01 など |
title |
見出し(例: ルート 1) |
time_summary / transfers / fare / distance_km |
概要行の各要素 |
legs |
list[TrainLeg] 列車区間のリスト |
format_verbose() |
人間向けの複数行テキスト(CLI の詳細表示と同系) |
TrainLeg(1 乗車区間)
| フィールド | 内容 |
|---|---|
departure_station / arrival_station |
区間の端の駅名 |
departure_times / arrival_times |
駅ブロックから取った時刻文字列 |
line_and_direction |
路線名・方面など |
platform |
番線情報 |
riding_position |
乗車位置(車両両数など) |
intermediate_stops |
list[IntermediateStop] 途中停車 |
segment_fare_note |
特急区間などの料金メモがあれば |
IntermediateStop
| フィールド | 内容 |
|---|---|
time |
時刻 |
station_name |
駅名 |
検索 URL の仕組み(概要)
本パッケージは、ブラウザがフォーム送信で開くのと同様に、概ね次の形の URL に GET します。
https://transit.yahoo.co.jp/search/result?from=...&to=...&y=...&m=...&d=...&hh=...&m1=...&m2=...&...
- 分は HTML フォームの
mmではなく、クエリではm1(十の位)とm2(一の位) に分かれる形式です。minute_to_query_partsがその変換を行います。 - 経由は
via01,via02, … として付与します。 - 列挙型でない追加パラメータは
TransitSearchParams.extra_queryにdict[str, str]で渡せます(サイト側が受け付けるキーに限る)。
注意・制限
-
駅名の表記
ブラウザのサジェストで確定した駅名と、手入力の揺れで結果が変わることがあります。意図した停車駅にならない場合は、サイト上の表記に合わせてください。 -
利用ポリシー
短時間に大量リクエストを送らない、商用利用は各種規約を確認する、などご利用は自己責任でお願いします。 -
HTML 変更
Yahoo!路線情報のマークアップが変わると、パースが一部失敗する可能性があります。 -
取得できないもの
ログイン後のみの機能、JavaScript 実行後にしか出ない情報などは、本パッケージの対象外です。
トラブルシュート
| 現象 | 確認すること |
|---|---|
URLError / タイムアウト |
ネットワーク、--timeout の延長、ファイアウォール |
| 一覧は空、パース結果が空 | HTML 構造変更の可能性。fetch_search_result の生 HTML を保存して issue に |
| 駅が別名に解釈される | 出発・到着の文字列をサイト検索と揃える |
| Windows で文字化け | コンソールのコードページ。UTF-8 出力(chcp 65001)やファイルへリダイレクトを検討 |
開発・配布
pip install build twine
python -m build
twine check dist/*
twine upload dist/*
ローカルでサンプルを動かす:
pip install -e .
python examples/demo_route_search.py
バージョン・作者・ライセンス
- バージョン: 1.0.0(
norikae.__version__と同じ) - 作者: tikisan
- リポジトリ: github.com/tikipiya/norikae
- ライセンス: MIT(
LICENSEファイル)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file norikae-1.0.0.tar.gz.
File metadata
- Download URL: norikae-1.0.0.tar.gz
- Upload date:
- Size: 20.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd9ce8b78eacbaf11ac9c0ddc45a791cea87e1804e22951caff12b990179288e
|
|
| MD5 |
408f8dbf0f85aa5b3ca10c12d25b8f85
|
|
| BLAKE2b-256 |
977d60482ac08cb2aba14b67279043736ed197e02b41625e34bc44be73b80ed8
|
File details
Details for the file norikae-1.0.0-py3-none-any.whl.
File metadata
- Download URL: norikae-1.0.0-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d6281b9d4ce1a6b751467230534216c9f7c96a127ef08cff8327e2f4761d88a
|
|
| MD5 |
78390774f61bd68302e88fa0270d8ed5
|
|
| BLAKE2b-256 |
640a3e8bae02bac021d44136ed44d82f310ee5aa2f37e2f98528a44d4dbb7edb
|