前回の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()