saddleの記録

saddleの記録

自転車に乗ってどこかに行った記録やその他いろんな記録を残します

コミケに始発で行けるお得な物件をPythonを使って探そう #2 コミケ駅別始発到着時刻調査編

#1に続き,今回はコミケに始発で行ける駅を特定します。
saddlenreport.hatenablog.jp

同じくwebスクレイピングを使用しますが,前回とは少しやり方が異なります。
終結果だけ見たい人は「首都圏の各駅から始発で国際展示場に何時に着けるか」までとんでください。

やりたいこと

  • 調べたい駅の一覧のcsvを読み込む
  • その駅から「国際展示場駅」まで始発で行くときの出発時刻と到着時刻と運賃の取得
  • 到着時刻が早い順に並べ替え
  • 結果の出力

調べたい駅の一覧のcsvの作成

以下のようなcsvを用意します
f:id:saddle93:20200401222412p:plain
そのまま駅名を羅列します。路線別にまとめて並べています。複数路線が乗り入れる駅は路線の数分重複しています。こうすることで,初電の列車がどこ始発なのかがわかりやすくなります。(例えば京浜東北線南行初電は南浦和駅始発)
このときなんの文字コードで書いたかを確認しておく必要があります。駅データの一覧は以下のサイトからフリーでダウンロードできるので活用しました。このデータは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"を読み込んで始発到着時刻を調べるプログラムになっています。
やっていることは

  1. 駅データの読み込み
  2. Chromeドライバの読み込みとYahoo乗り換えサイトオープン
  3. 条件を設定して検索,結果の取得を駅数分繰り返し
  4. ブラウザを閉じて結果をcsv出力

となっています
経由地を設定したいときは以下のコードを追加します

    #サイトの経由駅の場所を特定
    v_svia1 = v_browser.find_element_by_id('svia1')
    #経由駅を入力
    v_svia1.send_keys('新木場')

JR総武中央緩行線の出力結果です

f:id:saddle93:20200402145148p:plain
JR総武中央緩行線の各駅から始発で国際展示場駅に何時に到着できるか
中野~秋葉原の各駅と両国からだと,国際展示場駅に5:43(りんかい線新木場始発)に到着できます。秋葉原と両国の間の浅草橋からだと到着できないのが面白いポイントです。

経由駅の設定による結果の差

いろんな路線でこの処理をしていて気づいたのは,経由駅の設定の仕方で結果が変わってしまうことです。当然だろうと思うかもしれないですが,「経由駅を設定しない検索結果」よりも「経由駅を設定した検索結果」のほうが到着時刻が早くなるケースがありました。
以下に京浜東北線の2つの処理結果を示します。

f:id:saddle93:20200402150056p:plain
経由駅設定なしの結果
f:id:saddle93:20200402150146p:plain
経由駅を「新木場」としたときの結果
南浦和~品川の各駅は同じ5:43着の結果となっていますが,新木場を経由地に設定することで大井町桜木町の各駅からも5:43着が可能になるという結果になりました。これは正直意図しない結果でした。Yahoo路線検索の始発検索は,本当に早く到着できる乗り換えを表示するわけではないそうです。
試しに,大井町から国際展示場で始発検索を2パターンやってみると,
f:id:saddle93:20200402150912p:plain
上が通常検索,下が新木場経由検索
経由地を設定すると10分も早く到着できます。まあ1時間早く出てまで10分先に到着したいか,という話なのですが,コミケ始発組にとって10分は大きな差です。
このように経由地の設定の仕方で到着時刻が変わってしまい,「本当の始発」の特定が現状難しいです。他にゆりかもめを考慮して豊洲経由にすると,また結果が変わります。じゃあ全部新木場経由で検索すればいいじゃないか,と思うかもしれませんがそうすると本来大崎始発に乗れる駅の特定が難しくなります。
これを解決するには経由駅を複数パターン用意してそれぞれ検索し,最も早く到着できるものを記録する,という手段が考えられます。処理時間が数倍になるので自分はやっていません。もしもっとスマートな方法があったら教えてください。

首都圏の各駅から始発で国際展示場に何時に着けるか

以下が調査結果です。青が5:43より前に到着,赤が5:43に到着,緑が5:53までに到着できる駅になります。(2020年3月ダイヤ改正後)

f:id:saddle93:20200402153037p:plain
2020年3月ダイヤ改正
図はinkscapeを使って自作しました。京浜東北線,中央線,京葉線有楽町線沿いが早く到着できる傾向になっています。5:43に到着できる一番遠い駅は保谷蘇我でしょうか。
ちなみに2019年版と比較してみたところ,高円寺~三鷹の各駅がダイヤ改正で始発繰り下げにより5:43に到着できなくなりました。他にも始発繰り下げの影響を受けているところがありました。

問題点

同じ駅名をもつ駅に対応できていません。例えば日吉(東急東横線と山陰線)や霞が関(日比谷線東武東上線)など。
これはまず駅データのマスターから同一駅名を抽出して,辞書的な役割をさせてうまく区別させる必要がありそうです。気が向いたらやってみます。

以上です。
次はいよいよコミケに始発で行ける賃料相場の安い駅を特定します。