Python: Selenium: 自分のMacのChromeブラウザ設定を使って自動WEBサーフィンするプログラミング

ただ単にSeleniumを使うのと違うところは、普段使いの自分のCookieや設定を維持したままChromeを自動操縦できることです。
あとは、起動しっぱなしのChromeブラウザを好きに操作できるので、毎回Chromeが立ち上がっては消えてしまう、のを避けられること。試行錯誤しながらコーディングするのに有用です。

# 手順

## MacにChromeをインストールする

まず、SafariなどでWEB検索して普通にChromeをインストールします。

## Chromeのメジャーバージョンナンバーを調べる

Chromeを起動して、アドレスバーに `chrome://version/` と入力してジャンプすると調べられます。

![スクリーンショット 2022-04-20 18.21.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/3cd80dfc-672a-f64a-17a5-2cc0bc12ec49.png)

## 自分のChromeプロファイル名を調べる

これも先ほどの画面の中にあります。

![スクリーンショット 2022-04-20 18.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/81394355-0267-3899-7da0-ce11a1af817d.png)

## Python用Seleniumライブラリとchromedriver-binaryをインストールする

ターミナルから以下のコマンドでインストールします。
Pythonと一緒にインストールされるpipコマンドを使います。

```bash
pip install selenium chromedriver-binary==100.*
```

chromedriver-binaryは、バージョンを指定します。
指定するナンバーは、先ほど調べたChrome本体のメジャーバージョンと合わせたものです。


## Chromeをデバッグポート有効状態で起動する

1. まず、今デスクトップで起動しているChromeを全て完全に終了させます。
2. 次に、ターミナルから以下のコマンドでChromeを起動します。
Chrome実行ファイルのパスは、皆さんの環境に合わせて書き換えてください。

```bash
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --profile-directory="Default"
```
`--profile-directory` オプションには、先ほど調べた自分のChromeプロファイル名を設定します。

何かエラーログが出るかもしれませんが、多分大丈夫です。
ちゃんと起動できているか確認するには、アドレスバーに `http://localhost:9222/json` と入力してジャンプしてみてください。
↓こういう画面が出ればOKです。
![スクリーンショット 2022-04-20 18.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/b3468691-6476-9a6d-f0c2-17b490ccea73.png)


## ChromeをSeleniumで自動操縦するプログラムを実行する

以下のサンプルプログラムは、
1. Google検索にジャンプして、 
1. `ちいかわ うさぎ` と検索して、
1. １ページ目の検索結果の中からランダムに１つ選んでジャンプします。


↓ この箇所は、皆さんの環境に合わせて書き換えてください。
（pipでインストールしたなら、ほとんど一緒だとは思いますが）
```Python
executable_path="/opt/homebrew/lib/python3.9/site-packages/chromedriver_binary/chromedriver",
```

```Python
import random
import time

import chromedriver_binary
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait

def main():
    options = webdriver.ChromeOptions()

    # iPhoneXをエミュレートした画面で実行する
    mobile_emulation = {"deviceName": "iPhone X"}
    options.add_experimental_option("mobileEmulation", mobile_emulation)

    # ポート9222でデバッグ通信を待ち受けているChromeを操作する
    options.add_argument("--remote-debugging-port=9222")

    driver = webdriver.Chrome(
        options=options,
        executable_path="/opt/homebrew/lib/python3.9/site-packages/chromedriver_binary/chromedriver",
    )

    search_word = "ちいかわ うさぎ"

    try:
        # 新しいタブを作成する
        driver.execute_script("window.open()")

        # 新しいタブに切り替える
        time.sleep(1)
        driver.switch_to.window(driver.window_handles[-1])

        driver.get("https://www.google.com/")

        wait = WebDriverWait(driver, 10)

        # 検索テキストボックスがレンダリングされるまで待つ
        locator_search_textbox = (By.CSS_SELECTOR, "input[title=検索]")
        wait.until(expected_conditions.visibility_of_element_located(locator_search_textbox))

        # 検索ワードを入力する
        driver.find_element(*locator_search_textbox).clear()
        driver.find_element(*locator_search_textbox).send_keys(search_word)

        # 検索ボタンを押す
        # driver.find_element(By.NAME, "btnK").click() # 上にdivとかが被ってると発動しなかったりする
        driver.execute_script('document.querySelector("input[name=btnK]").click();')

        # 検索結果画面の結果エリアがレンダリングされるまで待つ
        wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "div.main")))

        # 検索結果のリンク要素を取得
        links_search_result = driver.find_elements(By.CSS_SELECTOR, "h3.LC20lb")

        # 検索結果のリンクが１つ以上あったら、ランダムにクリックする
        if links_search_result:
            links_search_result[random.randint(0, len(links_search_result)-1)].click()
    finally:
        driver.quit()


main()

```

どうでしょう。
うまくいきましたでしょうか。
自分のデスクトップで起動しているChromeが、勝手に検索して勝手にジャンプする動きが目視できたかと思います。

<img width="300" alt="スクリーンショット 2022-04-20 18.50.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/95261d29-5b0e-dad6-c324-49d4f902b615.png">