0
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-10-26

前回は、「8.ブラウザを開いて閉じる。」について投稿しました。
今回は、openpyxlライブラリを使用して会員・予約情報を取り込みます。


必要なパッケージを importする。

reserveLesson.py
  5:  from openpyxl import load_workbook
  6:  import os

詳細処理説明

5: openpyxlライブラリの load_workbook関数をインポートします。

  •  会員・予約情報Excelファイル読み込みで使用します。

6: osライブラリをインポートします。

  •  Excelファイルパス取得で使用します。

定数を定義します。

reserveLesson.py
 10:  EXCEL_FILENAME = "reserveLessonList.xlsx"

詳細処理説明

10: 会員・予約情報Excelファイル名を定数化しました。

main処理

mainサブで会員・予約情報Excelファイル情報を読み込むgetExcelDicListファンクションをコールする処理を追加しました。20行目です。: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()

詳細処理説明

20: 会員・予約情報Excelファイルを辞書のリスト形式で取得します。
21: rsvlstの中身確認

会員・予約情報を取得するファンクション-getExcelDicList()

Excelファイルを開き、会員・予約情報を 辞書のリスト変数に取り込みます。

WS000003.JPG
辞書のリスト(rsvlst)の中身
Excelシートの1行はリストの1行に取り込まれ、それぞれの列情報は「列名をキー」に「セル値をバリュー」という辞書形式で格納します。後々処理しやすいので、辞書のリストにしました。この関数を通した結果、この関数の戻り値rsvlstの中身は以下のようになります。
WS000004.JPG

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

詳細処理説明

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)を1つにまとめて、key値、value値を取得しています。
62: rcvinf['ユーザー名'] = 'aaa'、rcvinf['パスワード'] = 12345 といったぐあいになります。
64: できあがった1行分の辞書情報をリストに追加しています。

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:

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1