最近は大学の研究のためのコーディングばかりだったので、これが久々の投稿になります。
コード
早速コードを紹介。
get_arrivalTime.py
'''
Yahoo乗換から到着時間をスクレイピングで抽出する。
引数として以下を与える。
1. 出発地点 ... 駅名、バス停名、住所など
2. 到着地点 ... 駅名、バス停名、住所など
3. 出発時刻 ... datetime型で指定
返り値
到着時刻 ... datetime型
'''
import urllib.request
from bs4 import BeautifulSoup
import urllib.parse # URLエンコード、デコード
import datetime
def get_arrivalTime(departure_point="大阪",arival_point="東京",departure_time=datetime.datetime.today()):
dp_en = urllib.parse.quote(departure_point) # encode
ap_en = urllib.parse.quote(arival_point) # encode
dt_url = "&y={0}&m={1}&d={2}&hh={3}&m1={4}&m2={5}".format(
"{0:04d}".format(departure_time.year),
"{0:02d}".format(departure_time.month),
"{0:02d}".format(departure_time.day),
"{0:02d}".format(departure_time.hour),
"{0:02d}".format(departure_time.minute)[0],
"{0:02d}".format(departure_time.minute)[1])
url0 = 'https://transit.yahoo.co.jp/search/result?from='
url1 = '&flatlon=&to='
url2 = '&viacode=&viacode=&viacode='
url3 = '&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 + dp_en + url1 + ap_en + url2 + dt_url + url3
req = urllib.request.urlopen(url)
html = req.read().decode('utf-8')
soup = BeautifulSoup(html, 'html.parser')
time = soup.select("li.time") # 到着時間の記載部分を抽出
# print(time) # 詳細情報が欲しければこれを出力
arrive = time[2].select_one('span.mark').text.strip() # <span class="mark">で囲まれたテキストを抽出
arrival_time = datetime.datetime(
departure_time.year,
departure_time.month,
departure_time.day,
int(arrive[0:2]),
int(arrive[3:5]))
return arrival_time
if __name__ == '__main__':
now = datetime.datetime(2021, 10, 1, 10, 5)
at = get_arrivalTime(
"大阪府大阪市中央区大阪城1−1", #大阪城
"京都府京都市上京区京都御苑3", #京都御所
now)
print("到着時刻 ",at)
print("所要時間 ",at - now)
結果は次の通りになるはず。
到着時刻 2021-10-01 11:49:00
所要時間 1:44:00
いい感じ。
住所入れても、駅を入れても、ちゃんと働くので非常に便利です。
#コードの説明
あえて説明が必要なのは、
dt_url = "&y={0}&m={1}&d={2}&hh={3}&m1={4}&m2={5}".format(
"{0:04d}".format(departure_time.year),
"{0:02d}".format(departure_time.month),
"{0:02d}".format(departure_time.day),
"{0:02d}".format(departure_time.hour),
"{0:02d}".format(departure_time.minute)[0],
"{0:02d}".format(departure_time.minute)[1])
ぐらいかなと思います。
"{0:02d}"は、時間に関するリクエストパラメータを与える際に
、桁数をそろえる必要があったため、このような記述にしています。