はじめに
最近はプログラミングや自作アプリの解説ばかりをやりすぎて、用事がある場合を除いて鉄道に乗る機会はめっきり減ったのですが、それでも鉄道趣味は細々と続けている今日この頃です。今回は、そんな乗り鉄の私が作った「運賃計算アプリ」を紹介しようと思います。
本題
アプリとは言いましたが、GUIなどはない、極めて簡易的なものであり、出発駅と到着駅を受け入れてその間の運賃を表示するという、シンプルなものです。Pythonで作成しました。ソースコードは以下の通り。
ソースコード
import requests
from bs4 import BeautifulSoup
import re
def get_fare(departure_station, destination_station):
route_url = "https://transit.yahoo.co.jp/search/print?from="+departure_station+"&flatlon=&to="+destination_station
route_response = requests.get(route_url)
route_soup = BeautifulSoup(route_response.text, 'html.parser')
try:
route_summary = route_soup.find("div",class_ = "routeSummary")
fare = route_summary.find("li", class_ = "fare").get_text()
try:
fixed_fare = re.search(r'\d+(,\d+)*',fare).group().replace(",", "")
return int(fixed_fare)
except AttributeError:
return 0
except AttributeError:
return 0
while True:
departure_station = input("出発駅を入力してください:")
destination_station = input("到着駅を入力してください:")
print(get_fare(departure_station,destination_station))
continue_input = input("終了するには0, 続けるには1を入力してください:")
if continue_input == "0":
break
解説
ソースコードをご覧いただくと分かるのですが、Yahoo乗換検索に依拠しています。そのため、これをexe化して配布するのは技術的に容易でも、著作権的な観点からあえて配布しません(事実の列挙には著作性がないのかもしれないが[注1])。有識者の方がいらっしゃたらコメントをお願いします。
ソースコードは公開しますので、これを改変or実行するのは自由でしょう。
ソースコード前半で、出発駅と到着駅を引数として運賃を取得する関数(get_fare)を定義しています。その関数を用いて、後半部では実際に運賃を表示しています。極めてシンプルな構造です。
[注1]著作権法第10条第2項には、「事実の伝達にすぎない雑報及び時事の報道は、前項第一号に掲げる著作物に該当しない」とある。鉄道運賃を表示するYahoo乗換検索が同法の「事実の伝達」に該当するか否かが争点である。
実行
本ソースコードはPythonで構成されていますので、実行にあたってはPythonのインストールが必要です。以下からインストールが可能です。
インストールが完了したら、上記をコピーしてテキストエディタに貼り付けてpyファイルを新規作成し、パワーシェルかコマンドプロンプトを起動してこれを実行しましょう。すると以下のように出発駅と到着駅を入力する欄が出現します。
出発駅と到着駅を入力すると運賃が表示されます。
その後「終了するには0,続けるには1を入力してください:」と表示されますが、1を入力すると何度でもこれを繰り返すことができます。
0と表示される場合
ソースコードを見ると明らかですが、0と表示されるのはエラー(運賃を取得できなかった場合)です。特に、経路中に北海道新幹線の新青森~新函館北斗を含む場合はエラーを吐きます。これはYahoo乗換検索が新幹線を経路探索の対象とせず、在来線のみを参照するためです。同様の問題は出発駅と到着駅のいずれかに新幹線単独駅を含む場合にも起こります。
その他、本プログラムにおいて不具合や改善点などありましたら、コメントをお願いします。
実用性の検証
上記の通り、青函トンネルを跨がない限りは実用的に使えます。特に、青春18きっぷなどの企画乗車券の使用を検討する場合に、普通運賃と比較してどちらが良いのかを考慮する際に簡単に運賃を調べる方法として重宝します。
また、本スクリプトの関数を他のアプリに組み込むことで、運賃を自動計算するのにも使うことができます。実際、私はこれとは別に旅行計画の補助アプリを制作しているのですが、そのアプリに本スクリプトの関数を組み込んで運賃を表示しています。