元記事
背景
何かを調べるときに、Googleによる要約で、だいたい調べたいことがわかるから、要約とタイトル、URLをGoogle検索から引っ張りたかった。
目的
Google検索して、検索結果を取得し、CSVにして出力するのを自動化する。
自動化することで、今まで、検索に費やされていた時間を減らす。
要件定義
- ブラウザの自動操作
- 検索結果から、タイトルと要約、URLを得る
- 得た結果を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を使ったブラウザの自動操作をすることができるようになり、タイトルの取得も出来るようになったので、満足。
ブログを書くときに使えるぞ!
出来るようになったこと
- ドキュメントを嫌がらないで読めるようになった
- Google検索の自動化
- CSVに出力
課題
- リストの操作方法の復習
- これを、GoogleColabとスプレッドシートを連携して出来るようにする
- 最後二つの参考URLにあるようにスプレッドシートから、検索も出来るようにしたい。
- HTMLのClass名が変わるとまた、出来なくなるので、Class名が変更しても柔軟にデータを取得出来るようにしたい。
参考文献
- PythonでGoogle検索タイトルとURL一覧を抽出してみた
- Locating Elements
- WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話
- 最後二つの参考URLにあるようにスプレッドシートから、検索も出来るようにしたい。
- 【Python】Googleの検索結果をスクレイピングできない時の対処法【解説付き】
- 【Python】でGoogle検索からのcsv出力!【簡単】(元記事)
次回の実装
CSVのリストを用意して、そこから検索ワードを読み込むプログラムを作成する。今回作成したプログラムと結合して、複数の検索ワードでの検索を容易に行えるようにする。
また、スプレッドシートを用いた、データの格納を出来るようにする。