Python+Seleniumを用いたGoogle検索結果のCSV保存方法 メモ

* PythonとSeleniumを用いて、Google検索した結果（タイトルとURL）をCSVに保存する方法についてメモする。

## 事前準備

* Docker環境で動かすため、[こちら](https://qiita.com/KWS_0901/items/5076a2f4cff544505c5d)の構成でdocker-compose.ymlやDockerfileなどdocker-seleniumを動かすための設定を準備する。

## テストコード`test.py`

* 入力したキーワードをGoogle検索した結果(タイトルとURL)をCSVに保存する。
* 処理の流れ
  1. 検索キーワードの入力を受け付ける。
  2. Googleにアクセスし、入力キーワードで検索する。
  3. 検索結果からタイトルとURLを抽出する。
  4. 抽出結果をCSVファイルに出力する。

```python
import os
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

if __name__ == '__main__':
    filename = './google_search_result.csv'
    titles = []
    urls = []

    # Selenium Gridサーバーへ接続する。
    driver = webdriver.Remote(
        command_executor=os.environ["SELENIUM_URL"],
        desired_capabilities=DesiredCapabilities.CHROME.copy()
    )

    # 1. 検索キーワード入力
    keyword = input("Search Keyword：")

    # 2. Googleにアクセス+入力キーワードで検索
    driver.get("https://google.com")
    driver.find_element(By.NAME, "q").send_keys(keyword + Keys.RETURN)
    # 検索結果描画待機
    wait = WebDriverWait(driver, 10)
    wait.until(
        presence_of_element_located((By.XPATH, '//a/h3')))

    # 3. タイトルとURLを抽出
    for elem_h3 in driver.find_elements_by_xpath('//a/h3'):
        title = elem_h3.text
        url = elem_h3.find_element_by_xpath('..').get_attribute('href')
        print("Title:"+title+" | "+"URL:"+url)
        titles.append(title)
        urls.append(url)

    # 4. csv出力
    result = [list(row) for row in zip(titles, urls)]
    with open(filename, mode="w", encoding="utf-8") as f:
        writer = csv.writer(f, lineterminator="\n")
        writer.writerows(result)
    driver.quit()

```

## 動作確認

* ビルド→起動→コンテナの中に入る。

```shell
docker-compose build --no-cache
docker-compose up -d
docker-compose exec app bash
```

* コード実行(`selenium`で検索)

```shell
cd test
python test.py
Search Keyword：selenium
Title:Seleniumブラウザー自動化プロジェクト :: Selenium ... | URL:https://www.selenium.dev/documentation/ja/
Title:10分で理解する Selenium - Qiita | URL:https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a
Title:Selenium (ソフトウェア) - Wikipedia | URL:https://ja.wikipedia.org/wiki/Selenium_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
Title:入門、Selenium | 第1回 Seleniumの仕組み | CodeGrid | URL:https://www.codegrid.net/articles/2014-selenium-1/
Title:Webの操作を自動化してくれる「Selenium」を使ってみた ... | URL:https://www.leon-tec.co.jp/blog/yoshida/8453/
Title:Selenium with Python — Selenium Python Bindings 2 ... | URL:https://selenium-python.readthedocs.io/
Title:Selenium実践入門 ―― 自動化による継続的なブラウザテスト ... | URL:https://www.amazon.co.jp/Selenium%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8B%E7%B6%99%E7%B6%9A%E7%9A%84%E3%81%AA%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%86%E3%82%B9%E3%83%88-WEB-PRESS-plus/dp/4774178942
Title:Amazon.co.jp: Selenium - アマゾン | URL:https://www.amazon.co.jp/Selenium/s?k=Selenium
Title:Selenium入門 Pythonでブラウザを自動化したい方必読！ | AI ... | URL:https://aiacademy.jp/media/?p=346
Title:Java/SeleniumのテストコードをAWS CodeBuildで実行する ... | URL:https://www.tdi.co.jp/miso/java-selenium-aws-codebuild
```

* CSV出力結果確認

```shell
cat google_search_result.csv 
Seleniumブラウザー自動化プロジェクト :: Selenium ...,https://www.selenium.dev/documentation/ja/
10分で理解する Selenium - Qiita,https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a
Selenium (ソフトウェア) - Wikipedia,https://ja.wikipedia.org/wiki/Selenium_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
入門、Selenium | 第1回 Seleniumの仕組み | CodeGrid,https://www.codegrid.net/articles/2014-selenium-1/
Webの操作を自動化してくれる「Selenium」を使ってみた ...,https://www.leon-tec.co.jp/blog/yoshida/8453/
Selenium with Python — Selenium Python Bindings 2 ...,https://selenium-python.readthedocs.io/
Selenium実践入門 ―― 自動化による継続的なブラウザテスト ...,https://www.amazon.co.jp/Selenium%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8B%E7%B6%99%E7%B6%9A%E7%9A%84%E3%81%AA%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%86%E3%82%B9%E3%83%88-WEB-PRESS-plus/dp/4774178942
Amazon.co.jp: Selenium - アマゾン,https://www.amazon.co.jp/Selenium/s?k=Selenium
Selenium入門 Pythonでブラウザを自動化したい方必読！ | AI ...,https://aiacademy.jp/media/?p=346
Java/SeleniumのテストコードをAWS CodeBuildで実行する ...,https://www.tdi.co.jp/miso/java-selenium-aws-codebuild
```



## 参考情報

* [図解！PythonでSeleniumを使ったスクレイピングを徹底解説！(インストール・使い方・Chrome)](https://ai-inter1.com/python-selenium/)