電車の乗り換え案内はYahoo乗換を使っています。

案内とか良いから、とにかく何時に最寄駅に着くか知りたい(テキストで)

ということで、Pythonを使ってやってみました。

Yahoo乗換案内をスクレイピングして到着時間を抽出します。

プログラム

'''
現在時刻から直近の乗換案内を検索して、到着時間を表示する
Yahoo乗換から到着時間をスクレイピングで抽出している
'''
import urllib.request
from bs4 import BeautifulSoup
import urllib.parse # URLエンコード、デコード

startsta = '東京' # 出発駅
endsta = '横浜' # 到着駅

startstaen = urllib.parse.quote(startsta) # encode
endstaen = urllib.parse.quote(endsta) # encode

url0 = 'https://transit.yahoo.co.jp/search/result?from='
url1 = '&flatlon=&to='
url2 = '&viacode=&viacode=&viacode=&shin=&ex=&hb=&al=&lb=&sr=&type=1&ws=3&s=&ei=&fl=1&tl=3&expkind=1&ticket=ic&mtf=1&userpass=0&detour_id=&fromgid=&togid=&kw='

url = url0 + startstaen + url1 + endstaen + url2 + endstaen
# print(url)

req = urllib.request.urlopen(url)
html = req.read().decode('utf-8')

soup = BeautifulSoup(html, 'html.parser')

time = soup.select("li.time") # 到着時間の記載部分を抽出
# print(time)
# print(time[2])

print('===到着時間抽出===')
arrive = time[2].select_one('span.mark').text.strip() # <span class="mark">で囲まれたテキストを抽出
print(arrive)

プログラムの説明

簡単に説明していきます(^^)

startsta = '東京' # 出発駅
endsta = '横浜' # 到着駅

startstaen = urllib.parse.quote(startsta) # encode
endstaen = urllib.parse.quote(endsta) # encode

出発駅と到着駅を定義して、エンコードしています。

url0 = 'https://transit.yahoo.co.jp/search/result?from='
url1 = '&flatlon=&to='
url2 = '&viacode=&viacode=&viacode=&shin=&ex=&hb=&al=&lb=&sr=&type=1&ws=3&s=&ei=&fl=1&tl=3&expkind=1&ticket=ic&mtf=1&userpass=0&detour_id=&fromgid=&togid=&kw='

url = url0 + startstaen + url1 + endstaen + url2 + endstaen
# print(url)

スクレイピングするURLはurlです。url0,1,2は以下で紹介している、”(最終)案内 現在時刻 1件表示”のURLを分解したもので、現在時刻での乗換検索結果を表示します。

req = urllib.request.urlopen(url)
html = req.read().decode('utf-8')
soup = BeautifulSoup(html, 'html.parser')

urlを開いて、BeautifulSoupで解析します。

time = soup.select("li.time") # 到着時間の記載部分を抽出
# print(time)
# print(time[2])

到着時間の記載部分を抽出します。

timeは配列になっています。timeとtime[2]をprintすると以下になります(例です)。

[<li class="time">2020年09月26日(土)<span>16:28出発</span></li>, <li class="time">16:37→<span class="mark">17:01</span><span class="small">24分</span></li>, <li class="time"><span>16:37発→<span class="mark">17:01着</span></span>24分(乗車24分)</li>]

<li class="time"><span>16:37発→<span class="mark">17:01着</span></span>24分(乗車24分)</li>
print('===到着時間抽出===')
arrive = time[2].select_one('span.mark').text.strip() # <span class="mark">で囲まれたテキストを抽出
print(arrive)

time[2]から到着時間(”17:01着”と記載部分)を抽出すればよいので、”.text.strip()”で抽出すると以下のようになります。

===到着時間抽出===
17:01着

到着時間をテキストで抽出できました。

おしまい(^^)