1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

通勤時間をpythonによるスクレイピングで取得

Last updated at Posted at 2021-10-01

最近は大学の研究のためのコーディングばかりだったので、これが久々の投稿になります。

コード

早速コードを紹介。

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}"は、時間に関するリクエストパラメータを与える際に
、桁数をそろえる必要があったため、このような記述にしています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?