#1に続き,今回はコミケに始発で行ける駅を特定します。
saddlenreport.hatenablog.jp
同じくwebスクレイピングを使用しますが,前回とは少しやり方が異なります。
最終結果だけ見たい人は「首都圏の各駅から始発で国際展示場に何時に着けるか」までとんでください。
調べたい駅の一覧のcsvの作成
以下のようなcsvを用意します
そのまま駅名を羅列します。路線別にまとめて並べています。複数路線が乗り入れる駅は路線の数分重複しています。こうすることで,初電の列車がどこ始発なのかがわかりやすくなります。(例えば京浜東北線の南行初電は南浦和駅始発)
このときなんの文字コードで書いたかを確認しておく必要があります。駅データの一覧は以下のサイトからフリーでダウンロードできるので活用しました。このデータはutf-8で書かれています。
ekidata.jp
コード
コード自体は短くまとめることができます。
from bs4 import BeautifulSoup from selenium import webdriver import csv import pprint import pandas as pd from pandas import Series, DataFrame import time import sys import unicodedata sta =[] filename = 'sotetsu' csvname = filename + '.csv' for cols in csv.reader(open(csvname), delimiter=','): val = cols[0] sta.append(val) fare = [] deptime = [] arrtime = [] # Chrome用ドライバー読込 v_browser = webdriver.Chrome('D:\python\chromedriver.exe') # 路線検索サイトを開く v_browser.get('http://transit.yahoo.co.jp') for i in range(len(sta)): # サイトの出発駅の場所を特定 v_sfrom = v_browser.find_element_by_id("sfrom") # 出発駅を入力 v_sfrom.send_keys(sta[i]) # サイトの到着駅の場所を特定 v_sto = v_browser.find_element_by_id('sto') # 到着駅を入力 v_sto.send_keys('国際展示場') #始発を選択 radioButton = v_browser.find_element_by_id("tsFir"); radioButton.click(); v_sto.submit() # 運賃を取得し、円を取り除く v_fare = v_browser.find_element_by_class_name('fare').text.replace('円','') # 運賃からカンマを取り除く v_fare_int = v_fare.replace(',','') #出発時刻を取得 v_deptime_0 = v_browser.find_elements_by_class_name('time') v_deptime_1 = v_deptime_0[1].text.split('→') v_deptime = v_deptime_1[0] #運行に異常がある場合,[!]が出るので削除 if '[!]' in v_deptime: v_deptime = v_deptime.replace('[!]','') #到着時刻を取得 v_arrtime = v_browser.find_element_by_class_name('mark').text print(str(i+1) + '/' + str(len(sta))) print(sta[i]) print(v_fare_int) print(v_deptime) print(v_arrtime) fare.append(v_fare_int) deptime.append(v_deptime) arrtime.append(v_arrtime) #プログラムを10秒間停止する(スクレイピングマナー) time.sleep(10) v_browser.get('http://transit.yahoo.co.jp') # ブラウザを閉じる v_browser.close() #各配列をシリーズ化 sta = Series(sta) fare = Series(fare) deptime = Series(deptime) arrtime = Series(arrtime) output_df = pd.concat([sta,deptime,arrtime,fare], axis=1) output_df.columns=['出発駅','出発時刻','到着時刻','運賃'] output_df = output_df.rename_axis('MyIdx').sort_values(['到着時刻','MyIdx']) output_df.to_csv(filename + '_res.csv', sep = '\t',encoding='utf-16') print('csv出力完了')
上記のコードは自分で作成した相鉄線の駅一覧のデータシート"sotetsu.csv"を読み込んで始発到着時刻を調べるプログラムになっています。
やっていることは
となっています
経由地を設定したいときは以下のコードを追加します
#サイトの経由駅の場所を特定 v_svia1 = v_browser.find_element_by_id('svia1') #経由駅を入力 v_svia1.send_keys('新木場')
JR総武中央緩行線の出力結果です中野~秋葉原の各駅と両国からだと,国際展示場駅に5:43(りんかい線新木場始発)に到着できます。秋葉原と両国の間の浅草橋からだと到着できないのが面白いポイントです。
経由駅の設定による結果の差
いろんな路線でこの処理をしていて気づいたのは,経由駅の設定の仕方で結果が変わってしまうことです。当然だろうと思うかもしれないですが,「経由駅を設定しない検索結果」よりも「経由駅を設定した検索結果」のほうが到着時刻が早くなるケースがありました。
以下に京浜東北線の2つの処理結果を示します。南浦和~品川の各駅は同じ5:43着の結果となっていますが,新木場を経由地に設定することで大井町~桜木町の各駅からも5:43着が可能になるという結果になりました。これは正直意図しない結果でした。Yahoo路線検索の始発検索は,本当に早く到着できる乗り換えを表示するわけではないそうです。
試しに,大井町から国際展示場で始発検索を2パターンやってみると,経由地を設定すると10分も早く到着できます。まあ1時間早く出てまで10分先に到着したいか,という話なのですが,コミケ始発組にとって10分は大きな差です。
このように経由地の設定の仕方で到着時刻が変わってしまい,「本当の始発」の特定が現状難しいです。他にゆりかもめを考慮して豊洲経由にすると,また結果が変わります。じゃあ全部新木場経由で検索すればいいじゃないか,と思うかもしれませんがそうすると本来大崎始発に乗れる駅の特定が難しくなります。
これを解決するには経由駅を複数パターン用意してそれぞれ検索し,最も早く到着できるものを記録する,という手段が考えられます。処理時間が数倍になるので自分はやっていません。もしもっとスマートな方法があったら教えてください。