2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

元記事

背景

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

目的

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

要件定義

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

環境

  • Windows10Pro

  • Python3.7

  • Anaconda

環境構築方法

今回作成しているプログラムは、Chromeの81バージョンを前提としています。
そのため、プログラムを実行する前にChromeのバージョンを81にしておいてください。
↓こちらがわかりやすいです。
Google Chromeのバージョンの確認方法

pip install selenium
pip install chromedriver_binary

実際に書いたコード

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

参考文献

  1. PythonでGoogle検索タイトルとURL一覧を抽出してみた
  2. Locating Elements
  3. WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話
  4. 最後二つの参考URLにあるようにスプレッドシートから、検索も出来るようにしたい。
  5. 【Python】Googleの検索結果をスクレイピングできない時の対処法【解説付き】
  6. 【Python】でGoogle検索からのcsv出力!【簡単】(元記事)

次回の実装

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

2
5
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
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?