PythonでExcelからデータ読込→サイトで交通費検索→Excelへデータ書込

925

プログラミングを学ぶ上で、Excelとブラウザを使う事例として、交通費検索は最適です。
今回は、Pythonでやってみました。

IMG_7328

※カフェにて

Pythonを使ってGoogleChromeで検索

今回は、Python(パイソン)で、
1 Excelからデータ(出発駅、到着駅)を読み取り
image
2 GoogleChromeで検索し、運賃を表示し、
image
3 Excelで書き込む

ex-it_04
というものをつくります。

以前、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
image
コミュニティエディションなら無料で、かつ十分です。

これらのほうが、
・ライブラリ(外部のアプリのようなもの)を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 出発駅の場所を特定する

乗換案内で、「出発」へ入力していきます。
プログラムでは、その場所を特定しなければいけません。

人へ伝えるように、「出発」と書いてあるところと、わかるように伝える必要があります。

image

サイトは、それぞれのパーツに名前がついており、その名前で指定することができます。
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行目だけを読み取れるようにしましょう。

image

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に書き込むようにしましょう。

image

 

# 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新」

メールサーバー移管サポート

■昨日の娘日記

風呂用に、娘が好きなカメさんを買ってから、風呂へすんなり入ります。
ご飯もそこそこに「カメさん!」とお風呂へ。
嫌がらないで入るから、まあいいかなと。
服を着るのはたまに嫌がりますが。

Spread the love