プログラミングを学ぶ上で、Excelとブラウザを使う事例として、交通費検索は最適です。
今回は、Pythonでやってみました。
※カフェにて
Pythonを使ってGoogleChromeで検索
今回は、Python(パイソン)で、
1 Excelからデータ(出発駅、到着駅)を読み取り
2 GoogleChromeで検索し、運賃を表示し、
3 Excelで書き込む
というものをつくります。
以前、RPAツールUiPathでつくる記事も書きました。
UiPath×Excel。Excelデータを読み取り、ブラウザで交通費検索。無料で使えるRPAツール。 | EX-IT
プログラミング言語Python(パイソン)の初期設定については、こちらを参考にしていただければ。
PythonとEXCELマクロ比較。Pythonの導入・設定【Windows・Mac両対応】 | EX-IT
設定にあるIDLE(アイドル)にかわりに、Pycharm(パイチャーム)というソフトを使っています;
PyCharm: Python IDE for Professional Developers by JetBrains
コミュニティエディションなら無料で、かつ十分です。
これらのほうが、
・ライブラリ(外部のアプリのようなもの)をPycharm上でインストールできる
・プログラム入力中に候補が出てくる
・実行はShift+F10。自動保存してくれる
・エラーチェックがしやすい
といった特徴があります。
(説明、導入をシンプルにするために前の記事では使いませんでしたが、圧倒的にこちらが使いやすいので、前の記事も書き換えるかもです)
では、プログラムをつくってみましょう。
プログラミングの鉄則の1つは、「小さくつくる」です。
1 Excelからデータ(出発駅、到着駅)を読み取り
2 GoogleChromeで検索し、運賃を表示し、
3 Excelで書き込む
のうち、2からつくっていきます。
Excelがからまないところをつくって、うまくいったら、Excel部分をつくり、それがうまくいたら、繰り返し部分をつくっていきましょう。
Chrome用のドライバーをインストール
PythonでChromeを動かすには、Seleniumというライブラリ(アプリのようなもの)を使います。
さらには、ブラウザ別のドライバー(ソフト)が必要です。
Chromeなら、ここから最新版をダウンロードして展開しましょう。
ChromeDriver – WebDriver for Chrome
展開後つくられたchromedriver.exeをわかりやすい場所に置きます。
私は、Cでドライブに、「Python」というフォルダをつくり、そこに置きました。
2 ライブラリ「selenium」をインポート
これ以降、Pycharmへプログラムを書いていきます。
まずは、ブラウザ用のライブラリを読み込みましょう。
from selenium import webdriver
をPycharmへ入力すると、警告が出る場合があります。
このライブラリがまだ入っていないからです。
その場合、クリックして、ライブラリをインストールしましょう。
※画像は別のライブラリですが、このようにインストールできます。
3 Chromeドライバーを読込
1で準備した、ドライバーを読み込みます。
# Chrome用ドライバー読込 v_browser = webdriver.Chrome('c:/python/chromedriver.exe')
パス(C:/~)を指定しましょう。
なお、「#」ではじまる行はコメントです。
わかりやすくするために自分なりに入れましょう。
Pycharmだと、Ctrl+/でコメントにできます(もう一度押すと通常のプログラムへ)。
4 Yahoo!路線情報を開く
ブラウザChromeを開き、Yahoo!路線検索を開きます。
# 路線検索サイトを開く v_browser.get('http://transit.yahoo.co.jp')
vが頭についているのは変数(任意に決められる)です。
変数.get(‘URL’)で開けます。
5 出発駅の場所を特定する
乗換案内で、「出発」へ入力していきます。
プログラムでは、その場所を特定しなければいけません。
人へ伝えるように、「出発」と書いてあるところと、わかるように伝える必要があります。
サイトは、それぞれのパーツに名前がついており、その名前で指定することができます。
Chromeだと、その確認がしやすいのです。
Windowsだと、ChromeでCtrl+Shift+Iを押してみましょう。
右側に、こういったプログラムが表示されます(表示されない場合、「Elements」をクリックしていただければ)。
実際はこういったもので表現しているのです。
(左側は、「Responsive」に切り替えるとみやすくなります)
出発のボックスで右クリックして、[検証]を押すと、その部分のプログラムを表示できます。
(1回ではこれができません。このときに、Ctrl+Shift+Iを押すと、右側のウィンドウが閉じてしまうので、右クリックで操作しましょう)
出発のボックスは、こういったプログラムです。
このidやname、typeなどを使って特定できます。
ここでは、idを使いましょう。
出発のボックスのidは、sfrom(station from)です。
Pycharmにこう入力します。
# サイトの出発駅の場所を特定 v_sform = v_browser.find_element_by_id("sfrom")
v_sfromは変数です。
変数= ブラウザの変数.find_element_by_id(‘id名’)で、この場所を特定できます。
ここがPythonやExcelマクロでブラウザを操作する場合に敷居が高い部分です。
RPAだと、ブラウザをクリックしたり、ブラウザで入力したりするとその操作を記録してくれ、そのときにこのidも設定してくれます。
とはいえ、それなりにプログラミングの知識が必要ですが。
6 出発駅を入力する
特定したその場所へ、出発駅を入力します。
たとえば、「渋谷」と入力するなら、こう書きましょう。
# 出発駅を入力 v_sfrom.send_keys('渋谷')
さきほどの場所v_sfromにsend_keysで、キー操作を伝えます。
この場合は、’渋谷’という操作です。
文字は、’(シングルコーテーション)で囲みましょう。
ここでプログラムを実行(PycharmだとShift+F10)し、出発駅に渋谷が入ればOKです。
7 到着駅を特定し、入力
同様に、到着駅を特定し、
# サイトの到着駅の場所を特定 v_sto = v_browser.find_element_by_id('sto')
たとえば、新宿と入力します。
# 到着駅を入力 v_sto.send_keys('新宿')
これもテストしましょう。
エラーの場合は、Pycharmの下にこのように表示されます。
最下行に、そのエラー内容があるので、まずそれを読み、上の詳細を読みましょう。
8 検索ボタンをクリック
検索ボタンをクリックするには、
v_sto.submit()
と入力します。
どの変数でもよく、ここでは、v_sto(到着)を使いました。
その後ろに、.submit()で、検索ボタンを押せます。
(検索ボタンのidがsubmit)
プログラムを動かしてみて、結果が表示されればOKです
9 交通費を読み取る
表示された結果の運賃を、最終的には、Excelに書き込みます。
この交通費のテキストを認識し、読み取り、確認してみましょう。
検証してみると、class=”fare”とあり、
ここではこう書きます。
# 運賃を取得し、円を取り除く v_fare = v_browser.find_element_by_class_name('fare').text.replace('円','')
classで指定されているので、
v_browser.find_element_by_class_name(‘fare’)
と指定し、テキストを認識するので、
v_browser.find_element_by_class_name(‘fare’).text
円があるとExcelに貼り付けるときに不都合なので(計算できない)、
v_browser.find_element_by_class_name(‘fare’).text.replace(‘円’,”)
とします。
replaceで、円を空欄に変えました。
さらには、Pythonの場合、「13,620」というときに、「,(カンマ)」があると、Excelに書き込むときに文字として認識されてしまいます。
そこで、
# 運賃からカンマを取り除く v_fare_int = v_fare.replace(',','')
と、もう1回、replaceしました。
一度にやろうとするとうまくいかなく。。
そして、
print(v_fare_int)
と入れれば、Pycharmの下の部分にその結果が表示されます。
この場合は、195です。
13,620円は、13620となります。
PythonでExcelから読込・Excelへ書き込み
ここまでできれば、次は、Excelをからませます。
1 ライブラリを読み込み、Excelを開く
Excel用のライブラリは、openpyxlです。
これをimportで読み込みます。
さらに、ファイルを、openpyxl.load_workbook(ファイル名)で開きま、シート(アクティブ、今開いている)を変数に入れましょう。
後で使いやすくするためです。
# Excel用ライブラリ読込 import openpyxl # Excelファイルを開く v_wb=openpyxl.load_workbook('C:\\Users\info0\Dropbox\セミナー RPA交通費ロボ.xlsx') # アクティブなシートを変数へ v_ws = v_wb.active
このとき、フォルダ名がusersだと、\ではなく、バックスラッシュでないとエラーが出ます。
Pycharmのフォントをこういったものに変えればバックスラッシュになりますので、変えておきましょう。
日本語用フォントには、バックスラッシュがないのです。
2 Excelから出発駅・到着駅を読み取る
今回の事例では、最終的に2行目から4行目を処理しますが、「小さくつくる」の鉄則どおり、まずは、2行目だけを読み取れるようにしましょう。
v_Excelfrom = v_ws['b2'].value v_Excelto = v_ws['c2'].value
それぞれ、変数を設定し、シートのセルB2(出発駅)、セルC2(到着駅)を読み取ります。
こうすれば、プログラムでExcelデータを使えます。
3 Excelデータを使うようにする
さきほど、
v_sfrom.send_keys(‘渋谷’)
としていたものを、Excelデータを使うように変更しましょう。
# Excelの出発駅を入力 v_sfrom.send_keys(v_Excelfrom)
同様に、到着駅も、変更します。
# Excelの到着駅を入力 v_sto.send_keys(v_Excelto)
4 Excelへ書き込み
検索して出てきた交通費をE列に書き込みます。
ここでは、まずセルE2に書き込むようにしましょう。
# Excelへ書き込み v_ws['e2'].value = int(v_fare_int)
セルE2へ、検索した交通費からカンマを取り除いたもの(v_fare_int)をintで数値にしたものを入れます。
5 ブラウザを閉じる
書き込んだら、ブラウザを閉じましょう。
(その前のタイミングでもいいのですが)
# ブラウザを閉じる v_browser.close()
6 Excelファイルの保存
最後にExcelファイルを保存します。
v_wb.save('C:\\Users\info0\Dropbox\セミナー RPA交通費ロボ.xlsx')
openpyxlライブラリは、Excelファイルを開かずに処理します。
だからこそ最後に保存しなければいけないのです。
ここまでが動けば、繰り返し部分をつくります。
Pythonで繰り返し処理
Pythonで繰り返し処理は、
for i in range(〇,△):
です。
このあとに、インデント(Tabキー1回)を入れた部分を〇から△ー1まで繰り返します。
△ー1なので、for i in range(2,5)で2から4で繰り返すということですので気を付けましょう。
今回は、2から4まで繰り返したいので、for i in range(2,5)でいいのですが、データが増減した場合にも対応するために、
for i in range(2,v_ws.max_row+1):
とすると便利です。
シートの最大行をカウントし(4)、それに+1をした5を自動的に設定できます。
では、これまでつくった部分をforの下のインデントに入れましょう。
# 2行目から、最大行+1まで繰り返す---------------------------------------------------------- for i in range(2,v_ws.max_row+1): # B列(出発駅)を変数へ v_Excelfrom = v_ws['b2'].value # C列(到着駅)を変数へ v_Excelto = v_ws['c2'].value # ブラウザ用ライブラリ読込 from selenium import webdriver # Chrome用ドライバー読込 v_browser = webdriver.Chrome('c:/python/chromedriver.exe') # 路線検索サイトを開く v_browser.get('http://transit.yahoo.co.jp') # サイトの出発駅の場所を特定 v_sfrom = v_browser.find_element_by_id('sfrom') # Excelの出発駅を入力 v_sfrom.send_keys(v_Excelfrom) # サイトの到着駅の場所を特定 v_sto = v_browser.find_element_by_id('sto') # Excelの到着駅を入力 v_sto.send_keys(v_Excelto) #検索ボタンをクリック v_sto.submit() # 運賃を取得し、円を取り除く v_fare = v_browser.find_element_by_class_name('fare').text.replace('円','') # 運賃からカンマを取り除く v_fare_int = v_fare.replace(',','') # Excelへ書き込み v_ws['e2'].value = int(v_fare_int) # ブラウザを閉じる v_browser.close() # ここまでを繰り返し -------------------------------------------------------------------- # Excelファイルを保存 v_wb.save('C:\\Users\info0\Dropbox\セミナー RPA交通費ロボ.xlsx')
どこからどこまでを繰り返すかが大事です。
ファイル保存は最後の1回でいいので、その手前まで繰り返します。
そして、繰り返すように、プログラムを変えていきましょう。
セルを指定しているのは、読み取りの部分と書き込みの部分。
それぞれ変数i(2から4まで変化する)に切り替えていきます。
このとき、’b2’を’b’ + str(i)と変えましょう。
2を3、4・・・・と変化させるので、iにするのですが、Pythonでは、文字ではないiをbとくっつけることはできません。
そこで、iを文字列にするstrをつけるのです。
Excelマクロだと、”b” & i とします。
# B列(出発駅)を変数へ v_Excelfrom = v_ws['b'+str(i)].value # C列(到着駅)を変数へ v_Excelto = v_ws['c'+str(i)].value
# Excelへ書き込み v_ws['e'+str(i)].value = int(v_fare_int)
これで完成です。
Excelからの読み込み、Chromeの操作、Excelの書き込みは応用がきくものですので、Python入門として実際にやってみていただければ。
全体のプログラムはこちらです。
# Excel用ライブラリ読込 import openpyxl # Excelファイルを開く v_wb=openpyxl.load_workbook('C:\\Users\info0\Dropbox\セミナー RPA交通費ロボ.xlsx') # アクティブなシートを変数へ v_ws = v_wb.active # 2行目から、最大行+1まで繰り返す---------------------------------------------------------- for i in range(2,v_ws.max_row+1): # B列(出発駅)を変数へ v_Excelfrom = v_ws['b'+str(i)].value # C列(到着駅)を変数へ v_Excelto = v_ws['c'+str(i)].value # ブラウザ用ライブラリ読込 from selenium import webdriver # Chrome用ドライバー読込 v_browser = webdriver.Chrome('c:/python/chromedriver.exe') # 路線検索サイトを開く v_browser.get('http://transit.yahoo.co.jp') # サイトの出発駅の場所を特定 v_sfrom = v_browser.find_element_by_id('sfrom') # Excelの出発駅を入力 v_sfrom.send_keys(v_Excelfrom) # サイトの到着駅の場所を特定 v_sto = v_browser.find_element_by_id('sto') # Excelの到着駅を入力 v_sto.send_keys(v_Excelto) #検索ボタンをクリック v_sto.submit() # 運賃を取得し、円を取り除く v_fare = v_browser.find_element_by_class_name('fare').text.replace('円','') # 運賃からカンマを取り除く v_fare_int = v_fare.replace(',','') # Excelへ書き込み v_ws['e'+str(i)].value = int(v_fare_int) # ブラウザを閉じる v_browser.close() # ここまでを繰り返し -------------------------------------------------------------------- # Excelファイルを保存 v_wb.save('C:\\Users\info0\Dropbox\セミナー RPA交通費ロボ.xlsx')
今年はトライアスロンがあと2戦(9月新潟村上、10川崎)。
フルマラソンは、12月の湘南と宮崎。
合間に、トレーニングもかねてハーフマラソン(埼玉の毛呂山ハーフ)を入れました。
アップダウンもあり、なかなか楽しめそうです。
■昨日の1日1新
※詳細は→「1日1新」
メールサーバー移管サポート
■昨日の娘日記
風呂用に、娘が好きなカメさんを買ってから、風呂へすんなり入ります。
ご飯もそこそこに「カメさん!」とお風呂へ。
嫌がらないで入るから、まあいいかなと。
服を着るのはたまに嫌がりますが。
■著書
『税理士のためのプログラミング -ChatGPTで知識ゼロから始める本-』
『すべてをがんばりすぎなくてもいい!顧問先の満足度を高める税理士業務の見極め方』
ひとり税理士のギモンに答える128問128答
【インボイス対応版】ひとり社長の経理の基本
「繁忙期」でもやりたいことを諦めない! 税理士のための業務効率化マニュアル
ひとり税理士の自宅仕事術
リモート経理完全マニュアル――小さな会社にお金を残す87のノウハウ
ひとり税理士のセーフティネットとリスクマネジメント
税理士のためのRPA入門~一歩踏み出せば変えられる!業務効率化の方法~
やってはいけないExcel――「やってはいけない」がわかると「Excelの正解」がわかる
AI時代のひとり税理士
新版 そのまま使える 経理&会計のためのExcel入門
フリーランスとひとり社長のための 経理をエクセルでトコトン楽にする本
新版 ひとり社長の経理の基本
『ひとり税理士の仕事術』
『フリーランスのための一生仕事に困らない本』
【監修】十人十色の「ひとり税理士」という生き方