前回のYahoo乗換で経路が出ない町に関しては、妙案がなく進んでいない。

前々回、PythonでYahoo乗換を操作する話を書いたが、コードを出していなかったので載せておく。

メイン関数でキーボードからの入力を元に、VBAの時と同じように所望のURLを生成している。get_trans関数が結果のページから必要な部分を取り出す処理である。駅と時刻を含むリストと、列車名のリストが別々に出てくるので、2つのリストを組み合わせて経路として出力している。

 

Excelを読み書きする部分はあまりに汚いのと、何も面白い部分がないので省略する。

 

追記、他のエンジンも串刺しできるように拡張した。

 

 

 

import sys
import datetime
import chromedriver_binary
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException

options = webdriver.ChromeOptions()
#ブラウザを表示させる場合、以下をコメントアウト
options.add_argument('--headless')

driver = webdriver.Chrome(options=options)

def get_trans():

    try:
        fare=driver.find_element_by_class_name("fare").text

    except NoSuchElementException:
        print("NoSuchElementException")
        exit
    else:
        fare=fare.replace('円','')#円を削除
        fare=fare.replace(',','')#カンマを削除
        print(fare)
        sta=list()
        sta=driver.find_elements_by_class_name("station") # 駅
        tr=driver.find_elements_by_class_name("transport") # 交通機関
        #[print(i.text+" FF") for i in st]
        out=""
        count=0
        l=list()
        l.append(" ")
        for i in sta:
            count+=1
            st=i.text
            #if(st.find('乗換不要'))
            #print(st)
            index_st=st.find(']')
            index_ed=st.find(' ',index_st+2)
            if(st.find('[dep]')>0 ):#出発駅
                l.append(st[index_st+2:index_ed])#駅名
                l.append(st[0:5])#出発時刻
            elif(st.find('[direct]')>0):#乗換不要
                l.append(st[0:5])#到着時刻
                index_ed=st.find('【',index_st+2)#駅名
                l.append(st[index_st+2:index_ed])
                l.append(st[0:5])#出発時刻として同じ時刻を入れる
            else:#到着駅、乗換駅
                l.append(st[0:5])#到着時刻
                l.append(st[index_st+2:index_ed])#駅名
            index=st.find('発')
            if('[arr]' in i.text):#到着駅の場合、終了
                break
            if(index>0 & index<10):#乗換駅、出発時間をリストへ入れる
                l.append(st[index-5:index])
                
        for j in range(0,count-1):#列車名
            st=tr[j].text
            start=st.find(']',7)
            end=st.find('地図で')#徒歩の場合、余分な文字を削除
            if(end==-1):
                l.insert(3*(j+1)+j,st[start+2:])
            else:
                l.insert(3*(j+1)+j,st[start+2:end])
        
        mm=int(l[len(l)-2][0:2])*60+int(l[len(l)-2][3:5])-int(l[2][0:2])*60-int(l[2][3:5])
        if(mm<0):#夜をまたぐ場合
            mm=mm+24*60
        hh=int(mm/60)
        mm=mm-hh*60
        
        print(str(hh)+':'+'{:02}'.format(mm))
        print(l[1:])


dt_now = datetime.datetime.now()
year=str(dt_now.year)
month=str(dt_now.month)
if(len(month)==1):
	month="0"+month
day=str(dt_now.day)
if(len(day)==1):
	day="0"+day

start="東京"
goal="大阪"
opt="d"
hh="9"
mm="00"#ここまでデフォルト値
while True:
	s=input("出発地点(終了=q) ["+start+"] ")
	if(s=="q"):
		driver.quit()
		break
	if(s!=""):
		start=s
	s=input("到着地点 ["+goal+"] ")
	if(s!=""):
		goal=s
	s=input("日付="+year+month+day+"(変更はd)、時 ["+hh+"] ")
	if(s=="d"):
		x=input("日["+day+"] ")
		if(x!=""):
			day=x
			if(len(day)==1):
				day="0"+day
	else:
		if(s!=""):
			hh=s
		if(len(hh)==1):
			hh="0"+hh
	s=input("分 ["+mm+"] ")
	if(s!=""):
		mm=s
	if(len(mm)==1):
		mm="0"+mm
	s=input("出発=>d 到着=>a ["+opt+"] ")
	if(s!=""):
		opt=s
	print(start,goal,hh,mm,opt)
	if(opt=="a"):
		type="4"
	if(opt=="d"):
		type="1"
	URL ="https://transit.yahoo.co.jp/search/result?flatlon=&"+"from="+start+"&tlatlon="+"&to="+goal+"&via=&via=&via="+"&y="+year+"&m="+month+"&d="+day+"&hh="+hh+"&m1="+mm[0:1]+"&m2="+mm[1:2]+"&type="+ type+"&ticket=ic"+"&al=1"+"&shin=1"+"&ex=1"+"&hb=1"+"&lb=1"+"&sr=1"+"&s=0"+"&expkind=1"+"&ws=1"

	driver.get(URL)
	get_trans()