【Python】妻に真夜中のダンスレッスン予約を強要されたので、Webスクレイピングで回避を試みようとしている話 （８．ブラウザを開いて閉じる。）

前回は、<a href="https://qiita.com/sibulabo/items/48dead3580ea86f5b0c3">「７．importについて確認せよ」</a>について投稿しました。
今回は、実際に seleniumで Google Chromeブラウザを開いて、あるサイトを表示し、閉じるまでをコーディングしたいと思います。

-------------------------------------------------------------------------------------------
## 必要なパッケージを importする。
```reserveLesson.py
 1  :  #各コンポーネントをインポート
 2  :  from selenium import webdriver
 3  :  from selenium.webdriver.chrome import service
 4  :  from webdriver_manager.chrome import ChromeDriverManager
```
### 詳細処理説明
:::note info
 2: seleniumライブラリの webdriverパッケージをインポートしています。
 3: seleniumライブラリの serviceモジュールをインポートしています。
- Chromeブラウザ起動時に直接 executable_pathを引数として渡していましたが、これは現在非推奨となっていて Serviceオブジェクト介して渡す必要があるので、この serviceモジュールをインポートしています。
:::

:::note info
 4: webdriver_managerの chromeモジュールをインポートしています。
- chromeドライバーの自動更新を実現するため、ドライバー管理ソフトウェアであるwebdriver_managerライブラリをインポートしています。
:::

## 定数を定義します。
Pythonでは、定数はサポートされていませんが、慣例的に大文字とアンダーバーで定数であることを表すようです。
```reserveLesson.py
 6  :  #--定数----------------
 7  :  LOGIN_URL = "https://google.com"    #ログイン画面のURL
```
:::note info
7: ログインURLを定数として定義しています。
:::
## main処理
mainサブで主要な処理をコーディングしています。
```Python
    9:  #---------------------
   10:  # main処理
   11:  #---------------------
   12:  def main():
   13:      #Serviceオブジェクトを介して、execute_pathを指定する。
   14:      chrome_service =  service.Service(executable_path=ChromeDriverManager().install())
   15:      #chromeドライバー セッション開始（最新Ver自動インストール、およびオプション指定）
   16:      driver = webdriver.Chrome(service=chrome_service, options=getOptions())
   17:      #サイトを表示する。
   18:      driver.get(LOGIN_URL)
   19:      #chromeドライバー セッション終了
   20:      driver.quit()
```

### 処理詳細説明
:::note info
14: Chromeドライバーの在り処である executable_pathを Serviceクラスに渡して serviceオブジェクトを生成します。
:::
:::note info
16: Chromeブラウザを開きます。
- 引数 serviceには、15行目で生成した serviceオブジェクトを渡しています。
- 引数 optionsには、後述する getOptionsファンクションで設定した Option値を渡しています。

`ブラウザが表示されました。` （headless=Falseにしているので表示されます。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/61a534b6-feb2-0489-ee73-4946db4c3b00.jpeg" width="50%">
:::
:::note info
18: サイトを表示します。
- 引数の表示するサイトの URLを指定します。ここでは、7行目で指定した定数 LOGIN_URLを指定しています。

`指定したサイトが表示されました。`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/6a626060-f99b-1b61-ad1a-411bc09deafe.jpeg" width="50%">
:::
:::note info
20: Chromeブラウザを閉じます。
:::

## Chromeドライバの Optionを設定するファンクション
ブラウザを開く際に引数に渡している Options値を指定して返すファンクションです。今後、複数のOption値設定を考慮してファンクションにしました。
```Python
   24:  #---------------------
   25:  # SubRoutine
   26:  #---------------------
   27:  #--Get ChromeDriver Options------
   28:  def getOptions():
   29:      options = webdriver.ChromeOptions()
   30:      options.headless = False    #ヘッドレスモード True:ブラウザ画面非表示、False:表示
   31:  
   32:      return options
```
:::note info
headlessプロパティで、ブラウザを開いた際に表示するか、それとも非表示にするかを指定できます。本番では、非表示にしますが、開発時はデバッグしやすいようFalse（非表示）を設定して表示するようにしています。
:::

## reserveLesson.pyの全容
```reserveLesson.py
#各コンポーネントをインポート
from selenium import webdriver
from selenium.webdriver.chrome import service
from webdriver_manager.chrome import ChromeDriverManager

#--定数----------------
LOGIN_URL = "https://google.com"    #ログイン画面のURL
#---------------------
# main処理
#---------------------
def main():
    #Serviceオブジェクトを介して、execute_pathを指定する。
    chrome_service =  service.Service(executable_path=ChromeDriverManager().install())
    #chromeドライバー セッション開始（最新Ver自動インストール、およびオプション指定）
    driver = webdriver.Chrome(service=chrome_service, options=getOptions())
    webdriver.chrome.webdriver.service
    #サイトを表示する。
    driver.get(LOGIN_URL)
    #chromeドライバー セッション終了
    driver.quit()

#---------------------
# SubRoutine
#---------------------
#--Get ChromeDriver Options------
def getOptions():
    options = webdriver.ChromeOptions()
    options.headless = False    #ヘッドレスモード True:ブラウザ画面非表示、False:表示

    return options

#-------------------------------
# スクリプト実行時に mainサブコール
#-------------------------------
if __name__ == '__main__':
    main()
```

> 今回は、ブラウザを開き、サイトを表示して閉じる。ところまでできました。
> 次回は、ブラウザの検証機能を使用して要素を確認しつつ、ログインするところまでできればなと思います。では、良い１日を！