yahoo路線乗り換え案内の情報を抽出したい


電車の乗り換え案内のAPIないかな?

なかなか使い勝手のいいものがない…
これは、過去に書いた記事と同じパターン…
yahoo路線の運行情報を取得したい

じゃあ解決策は、同じ! と思ったが

今回もBeautifulSoupを使ってスクレイピングしていこう!
と思ったが、普通にYahoo路線で経路を検索したときの結果が表示されるHTMlがそこそこ複雑で解析がめんどくさそう
もう少しシンプルなHTMLはないのかいろいろ探していると...

あった! 印刷するボタンから飛べるページがとてもシンプル!

さらに、URLもシンプル!
https://transit.yahoo.co.jp/search/print?from=出発駅&flatlon=&to=到着駅
これはありがたい
シンプルにURLパラメータに出発駅と到着駅を入れれば経路がわかる

じゃあBeautiful Soupで解析していこう

必要なライブラリ等は、yahoo路線の運行情報を取得したいをみて

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import strip

#出発駅の入力
departure_station = input("出発駅を入力してください:")
#到着駅の入力
destination_station = input("到着駅を入力してください:")

#経路の取得先URL
route_url = "https://transit.yahoo.co.jp/search/print?from="+departure_station+"&flatlon=&to="+ destination_station
print(route_url)
#Requestsを利用してWebページを取得する
route_response = requests.get(route_url)

# BeautifulSoupを利用してWebページを解析する
route_soup = BeautifulSoup(route_response.text, 'html.parser')

#経路のサマリーを取得
route_summary = route_soup.find("div",class_ = "routeSummary")
#所要時間を取得
required_time = route_summary.find("li",class_ = "time").get_text()
#乗り換え回数を取得
transfer_count = route_summary.find("li", class_ = "transfer").get_text()
#料金を取得
fare = route_summary.find("li", class_ = "fare").get_text()

print("======"+departure_station+"から"+destination_station+"=======")
print("所要時間:"+required_time)
print(transfer_count)
print("料金:"+fare)

#乗り換えの詳細情報を取得
route_detail = route_soup.find("div",class_ = "routeDetail")

#乗換駅の取得
stations = []
stations_tmp = route_detail.find_all("div", class_="station")
for station in stations_tmp:
    stations.append(station.get_text().strip())

#乗り換え路線の取得
lines = []
lines_tmp = route_detail.find_all("li", class_="transport")
for line in lines_tmp:
    line = line.find("div").get_text().strip()
    lines.append(line)

#路線ごとの所要時間を取得
estimated_times = []
estimated_times_tmp = route_detail.find_all("li", class_="estimatedTime")
for estimated_time in estimated_times_tmp:
    estimated_times.append(estimated_time.get_text())

print(estimated_times)

#路線ごとの料金を取得
fars = []
fars_tmp = route_detail.find_all("p", class_="fare")
for fare in fars_tmp:
    fars.append(fare.get_text().strip())


#乗り換え詳細情報の出力
print("======乗り換え情報======")
for station,line,estimated_time,fare in zip(stations,lines,estimated_times,fars):
    print(station)
    print( " | " + line + " " + estimated_time + " " + fare)

print(stations[len(stations)-1])

上記コードで試しに横浜から豊洲の経路を調べると

出発駅を入力してください:横浜
到着駅を入力してください:豊洲
https://transit.yahoo.co.jp/search/print?from=横浜&flatlon=&to=豊洲
======横浜から豊洲=======
所要時間:49分(乗車33分)
乗換:2回
料金:IC優先:628円
['16分', '10分', '7分']
======乗り換え情報======
横浜
 | 京急本線快特 16分 303円
品川
 | JR山手線内回り 10分 157円
有楽町
 | 東京メトロ有楽町線(和光市−新木場) 7分 168円
豊洲

いい感じだね!

もう少しやってみたいこと

現状、日付や出発時間などの検索オプションをつけることができていない
いずれも、URLパラメータを付与することで実現可能のように見える
どのパラメータに何を入れればいいのか明らかにしたい

注意事項

スクレイピングはグレーなところもあるので、悪用厳禁!