【Python】でGoogle検索からのcsv出力！【簡単】

# [元記事](https://acfoapon.hatenablog.com/entry/2020/04/16/120000?_ga=2.113898116.2051319045.1587005144-1011829840.1582693178)

# 背景
何かを調べるときに、Googleによる要約で、だいたい調べたいことがわかるから、要約とタイトル、URLをGoogle検索から引っ張りたかった。

# 目的
Google検索して、検索結果を取得し、CSVにして出力するのを自動化する。
自動化することで、今まで、検索に費やされていた時間を減らす。


## 要件定義
1. ブラウザの自動操作
1. 検索結果から、タイトルと要約、URLを得る
1. 得た結果をCSVに出力する




# 環境
- Windows10Pro

- Python3.7

- Anaconda

## 環境構築方法
今回作成しているプログラムは、Chromeの81バージョンを前提としています。  
そのため、プログラムを実行する前にChromeのバージョンを81にしておいてください。  
↓こちらがわかりやすいです。  
[Google Chromeのバージョンの確認方法](https://mhtdesign.net/guide/version-confirmation.html)


```
pip install selenium
pip install chromedriver_binary
```
# 実際に書いたコード


```Python
import csv
import time  # スリープを使うために必要
from selenium import webdriver  # Webブラウザを自動操作する（python -m pip install selenium)
import chromedriver_binary  # パスを通すためのコード

def ranking(driver):
    i = 1  # ループ番号、ページ番号を定義

    title_list = []  # タイトルを格納する空リストを用意
    link_list = []  # URLを格納する空リストを用意
    summary_list = []
    RelatedKeywords = []

    # 現在のページが指定した最大分析ページを超えるまでループする
    while i <= i_max:
        # タイトルとリンクはclass="r"に入っている
        class_group = driver.find_elements_by_class_name('r')
        class_group1 = driver.find_elements_by_class_name('s')
        class_group2 = driver.find_elements_by_class_name('nVcaUb')
        # タイトルとリンクを抽出しリストに追加するforループ
        for elem in class_group:
            title_list.append(elem.find_element_by_class_name('LC20lb').text)  # タイトル(class="LC20lb")
            link_list.append(elem.find_element_by_tag_name('a').get_attribute('href'))  # リンク(aタグのhref属性)

        for elem in class_group1:
            summary_list.append(elem.find_element_by_class_name('st').text)  # リンク(aタグのhref属性)

        for elem in class_group2:
            RelatedKeywords.append(elem.text)  # リンク(aタグのhref属性)

        # 「次へ」は1つしかないが、あえてelementsで複数検索。空のリストであれば最終ページの意味になる。
        if driver.find_elements_by_id('pnnext') == []:
            i = i_max + 1
        else:
            # 次ページのURLはid="pnnext"のhref属性
            next_page = driver.find_element_by_id('pnnext').get_attribute('href')
            driver.get(next_page)  # 次ページへ遷移する
            i = i + 1  # iを更新
            time.sleep(3)  # 3秒間待機

    return title_list, link_list, summary_list, RelatedKeywords  # タイトルとリンクのリストを戻り値に指定



driver = webdriver.Chrome()  # Chromeを準備

# サンプルのHTMLを開く
driver.get('https://www.google.com/')  # Googleを開く
i_max = 5  # 最大何ページまで分析するかを定義
search = driver.find_element_by_name('q')  # HTML内で検索ボックス(name='q')を指定する
search.send_keys('スクレイピング 自動化　"Python"')  # 検索ワードを送信する
search.submit()  # 検索を実行
time.sleep(1.5)  # 1.5秒間待機

# ranking関数を実行してタイトルとURLリストを取得する
title, link, summary, RelatedKeywords = ranking(driver)


csv_list = [["順位", "タイトル", "要約", "リンク", "関連キーワード"]]

for i in range(len(title)):
    add_list=[i+1,title[i],summary[i],link[i]]
    csv_list.append(add_list)

# タイトルリストをcsvに保存

with open('Search_word.csv','w',encoding="utf-8_sig") as f:
    writecsv = csv.writer(f, lineterminator='\n')
    writecsv.writerows(csv_list)

driver.quit()


```
# 感想
合計で、4時間程度で、作成することが出来た。
seleniumを使ったブラウザの自動操作をすることができるようになり、タイトルの取得も出来るようになったので、満足。
ブログを書くときに使えるぞ！

# 出来るようになったこと
1. ドキュメントを嫌がらないで読めるようになった
2. Google検索の自動化
3. CSVに出力

# 課題
1. リストの操作方法の復習
1. これを、GoogleColabとスプレッドシートを連携して出来るようにする
1. 最後二つの参考URLにあるようにスプレッドシートから、検索も出来るようにしたい。
1. HTMLのClass名が変わるとまた、出来なくなるので、Class名が変更しても柔軟にデータを取得出来るようにしたい。



# 参考文献


1. [PythonでGoogle検索タイトルとURL一覧を抽出してみた](https://watlab-blog.com/2019/08/15/python-google-searchlist/)  
1. [Locating Elements](https://selenium-python.readthedocs.io/locating-elements.html)  
1. [WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話](https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e)  
1. [最後二つの参考URLにあるようにスプレッドシートから、検索も出来るようにしたい。](https://tanuhack.com/google-scraping/)
1. [【Python】Googleの検索結果をスクレイピングできない時の対処法【解説付き】](https://katsuhiroblog.com/google-search-result-scraping/)
2. [【Python】でGoogle検索からのcsv出力！【簡単】(元記事)](https://acfoapon.hatenablog.com/entry/2020/04/16/120000?_ga=2.113898116.2051319045.1587005144-1011829840.1582693178)



## 次回の実装
CSVのリストを用意して、そこから検索ワードを読み込むプログラムを作成する。今回作成したプログラムと結合して、複数の検索ワードでの検索を容易に行えるようにする。  
また、スプレッドシートを用いた、データの格納を出来るようにする。