【Python】妻に真夜中のダンスレッスン予約を強要されたので、Webスクレイピングで回避を試みようとしている話 （９．会員・予約情報<Excel>を読み込む。）

前回は、<a href="https://qiita.com/sibulabo/items/5c6829d8e4b6540855c8">「８．ブラウザを開いて閉じる。」</a>について投稿しました。
今回は、openpyxlライブラリを使用して会員・予約情報を取り込みます。

-------------------------------------------------------------------------------------------
## 必要なパッケージを importする。
```reserveLesson.py
  5:  from openpyxl import load_workbook
  6:  import os
```
### 詳細処理説明
:::note info
5: openpyxlライブラリの load_workbook関数をインポートします。
- 　会員・予約情報Excelファイル読み込みで使用します。

6: osライブラリをインポートします。
- 　Excelファイルパス取得で使用します。
:::

## 定数を定義します。
```reserveLesson.py
 10:  EXCEL_FILENAME = "reserveLessonList.xlsx"
```
### 詳細処理説明
:::note info
 10: 会員・予約情報Excelファイル名を定数化しました。
:::

## main処理
mainサブで会員・予約情報Excelファイル情報を読み込むgetExcelDicListファンクションをコールする処理を追加しました。２０行目です。:relaxed:
```reserveLesson.py
 12:  #******************************************************************
 13:  # main処理
 14:  #******************************************************************
 15:  def main():
 16:      #ブラウザを開く。
 17:      driver = openChromBrowser()
 18:  
 19:      #会員・予約情報(Excel)を辞書リスト形式で取得する。
 20:      rsvlst = getExcelDicList()
 21:      print(rstlst)
 22:  
 23:      #chromeドライバー セッション終了
 24:      driver.quit()
```
### 詳細処理説明
:::note info
 20: 会員・予約情報Excelファイルを辞書のリスト形式で取得します。
 21: rsvlstの中身確認
:::

## 会員・予約情報を取得するファンクション-getExcelDicList()
Excelファイルを開き、会員・予約情報を **辞書のリスト**変数に取り込みます。

![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/85d53500-34ff-da12-e19b-cd7feda26d8a.jpeg)
 `辞書のリスト(rsvlst）の中身`
Excelシートの１行はリストの１行に取り込まれ、それぞれの列情報は「列名をキー」に「セル値をバリュー」という辞書形式で格納します。後々処理しやすいので、辞書のリストにしました。この関数を通した結果、この関数の戻り値rsvlstの中身は以下のようになります。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/22369110-c59a-d5f3-2f17-32303879a1f0.jpeg)

```reserveLesson.py
 45:  #--会員・予約情報を辞書リスト形式で取得する。---
 46:  def getExcelDicList():
 47:      #予約一覧Excelファイルパス取得
 48:      rsv_lst_path = os.path.join(os.getcwd(), EXCEL_FILENAME)
 49:      #予約一覧を読み込み専用で開く。
 50:      wb = load_workbook(rsv_lst_path, read_only=True)
 51:      #予約一覧シートを指定
 52:      ws = wb["予約一覧"]
 53:  
 54:      #* {列名：セル値}の辞書をリスト化する。（[{列名：セル値},{列名:セル値},...]）
 55:      header = ws[1]  #1行目の列名を取得
 56:      rsvlst =  []    #リスト初期化
 57:      #予約一覧データ部(2行目～)の行数分処理する。
 58:      for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
 59:          rsvinf = {}     #辞書初期化
 60:          #列名:セル値の辞書作成
 61:          for k, v in zip(header, row):
 62:              rsvinf[k.value] = v.value
 63:          #作成した辞書をリストに追加
 64:          rsvlst.append(rsvinf)
 65:  
 66:      #Close ExcelBook
 67:      wb.close()
 68:  
 69:      return rsvlst
```
### 詳細処理説明
:::note info
48: Excelファイルの絶対パスを取得しています。
- os.getcwd()でカレントパスを取得し、os.path.join()でそのパスとExcelファイル名を結合しています。

50: Excelファイル（reserveLessonList.xlsx）を読み取り専用で開いています。
52: 操作する"予約一覧"シートを取得しています。
55: 1行目の列タイトル（ユーザー名、パスワード など）を取得しています。
58: 2行目以降のデータ部分を設定されている行数分ループしています。
- iter_rows()関数を使用してシートの2行目(min_row=2)から順に取得しています。
- 行データは、row変数に設定されます。

59: 辞書変数の初期化
61: zip()関数で複数のタプル情報(header, row）を１つにまとめて、key値、value値を取得しています。
62: rcvinf['ユーザー名'] = 'aaa'、rcvinf['パスワード'] = 12345 といったぐあいになります。
64: できあがった１行分の辞書情報をリストに追加しています。
:::

## reserveLesson.pyの全容
```reserveLesson.py
  1:  #各コンポーネントをインポート
  2:  from selenium import webdriver
  3:  from selenium.webdriver.chrome import service
  4:  from webdriver_manager.chrome import ChromeDriverManager
  5:  from openpyxl import load_workbook
  6:  import os
  7:  
  8:  #--定数----------------
  9:  LOGIN_URL = "https://google.com"            #ログイン画面のURL
 10:  EXCEL_FILENAME = "reserveLessonList.xlsx"
 11:  
 12:  #******************************************************************
 13:  # main処理
 14:  #******************************************************************
 15:  def main():
 16:      #ブラウザを開く。
 17:      driver = openChromeBrowser()
 18:  
 19:      #会員・予約情報(Excel)を辞書リスト形式で取得する。
 20:      rsvlst = getExcelDicList()
 21:      print(rstlst)
 22:  
 23:      #chromeドライバー セッション終了
 24:      driver.quit()
 25:  
 26:  #---------------------
 27:  # SubRoutine
 28:  #---------------------
 29:  #--ブラウザを開く。
 30:  def openChromeBrowser():
 31:      #Serviceオブジェクトを介して、execute_pathを指定する。
 32:      chrome_service =  service.Service(executable_path=ChromeDriverManager().install())
 33:      #chromeドライバー セッション開始（最新Ver自動インストール、およびオプション指定）
 34:      driver = webdriver.Chrome(service=chrome_service, options=getOptions())
 35:  
 36:      return driver
 37:  
 38:  #--Get ChromeDriver Options------
 39:  def getOptions():
 40:      options = webdriver.ChromeOptions()
 41:      options.headless = False    #ヘッドレスモード True:ブラウザ画面非表示、False:表示
 42:  
 43:      return options
 44:  
 45:  #--会員・予約情報を辞書リスト形式で取得する。---
 46:  def getExcelDicList():
 47:      #予約一覧Excelファイルパス取得
 48:      rsv_lst_path = os.path.join(os.getcwd(), EXCEL_FILENAME)
 49:      #予約一覧を読み込み専用で開く。
 50:      wb = load_workbook(rsv_lst_path, read_only=True)
 51:      #予約一覧シートを指定
 52:      ws = wb["予約一覧"]
 53:  
 54:      #* {列名：セル値}の辞書をリスト化する。（[{列名：セル値},{列名:セル値},...]）
 55:      header = ws[1]  #1行目の列名を取得
 56:      rsvlst =  []    #リスト初期化
 57:      #予約一覧データ部(2行目～)の行数分処理する。
 58:      for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
 59:          rsvinf = {}     #辞書初期化
 60:          #列名:セル値の辞書作成
 61:          for k, v in zip(header, row):
 62:              rsvinf[k.value] = v.value
 63:          #作成した辞書をリストに追加
 64:          rsvlst.append(rsvinf)
 65:  
 66:      #Close ExcelBook
 67:      wb.close()
 68:  
 69:      return rsvlst
 70:  
 71:  #-------------------------------
 72:  # スクリプト実行時に mainサブコール
 73:  #-------------------------------
 74:  if __name__ == '__main__':
 75:      main()
```

なんかインプットに必死でアウトプットが雑になってすみません。:sweat:
知らないことが多すぎて、ググりすぎて、頭パンパンです。:confounded:

> 今回は、会員・予約情報をExcelファイルから読み込み、辞書リスト形式の変数に取得する処理を追加しました。次回は、ログインできるところまでできたらいいなぁ:joy: