Googleの検索結果を取得したい場合はSeleniumを使うと便利です。
ここではPythonとSeleniumを使ってgoogleの検索結果を動的にスクレイピングし、50件分のタイトルとURLを取得しExcelに書き出してみましょう。
スクレイピングする際のルール
スクレイピングは他のサイトの情報を取得する行為なので、著作権法を守る必要があります。
こちらにルールを記載していますので、スクレイピング前にまずこちらの記事をご確認ください。
Seleniumについて
Seleniumは本来プログラム側からブラウザを操作し、動作のテストをするために開発されたものですが、ブラウザからhtmlを動的に取得できるため、javascriptが使われているサイトのスクレイピングに適しています。
詳しい使い方はこちらの記事をどうぞ。
Googleの検索結果を取得する
では実際にGoogleの検索結果を50件分取得し、Excelに書き出してみましょう。
import openpyxl
import time
from selenium import webdriver
#googleで検索する文字
search_string = '猫 喋る なぜ'
#Seleniumを使うための設定とgoogleの画面への遷移
INTERVAL = 2.5
URL = "https://www.google.com/"
driver_path = "./chromedriver"
driver = webdriver.Chrome(executable_path=driver_path)
driver.maximize_window()
time.sleep(INTERVAL)
driver.get(URL)
time.sleep(INTERVAL)
#文字を入力して検索
driver.find_element_by_name('q').send_keys(search_string)
driver.find_elements_by_name('btnK')[1].click() #btnKが2つあるので、その内の後の方
time.sleep(INTERVAL)
#検索結果の一覧を取得する
results = []
flag = False
while True:
g_ary = driver.find_elements_by_class_name('g')
for g in g_ary:
result = {}
result['url'] = g.find_element_by_class_name('yuRUbf').find_element_by_tag_name('a').get_attribute('href')
result['title'] = g.find_element_by_tag_name('h3').find_element_by_tag_name('span').text
results.append(result)
if len(results) >= 50:
flag = True
break
if flag:
break
driver.find_element_by_id('pnnext').click()
time.sleep(INTERVAL)
#ワークブックの作成とヘッダ入力
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet['A1'].value = 'タイトル'
sheet['B1'].value = 'URL'
#シートにタイトルとURLの書き込み
for row, result in enumerate(results, 2):
sheet[f"A{row}"] = result['title']
sheet[f"B{row}"] = result['url']
workbook.save(f"google_search_{search_string}.xlsx")
driver.close()
[出力結果]

50件分のタイトルとURLを取得できました。
一つずつ見ていきましょう。
import openpyxl
import time
from selenium import webdriver
今回はopenpyxlとseleniumを使うので、それぞれインポートしています。
また、timeモジュールはGoogleが画面遷移するタイミングで処理をスリープするために使っています。
search_string = '猫 喋る なぜ'
search_stringにはGoogleで検索する文字列を入力しています。
INTERVAL = 2.5
URL = "https://www.google.com/"
driver_path = "./chromedriver"
driver = webdriver.Chrome(executable_path=driver_path)
driver.maximize_window()
time.sleep(INTERVAL)
driver.get(URL)
time.sleep(INTERVAL)
INTERVALには処理をスリープする際の秒数を、URLにはGoogleのURLを格納しています。
driver_pathにはchromedriverのパスを格納しています。それぞれの環境で異なってくる部分ですが、同じにする場合はこのプログラムと同じ階層にchromedriverを配置しましょう。
webdriver.Chrome関数にchromedriverを渡して、プログラム側からブラウザを操作するために必要なdriverを作成し、そのdriverとURLを使ってchromeでgoogleのサイトを開いています。
driver.find_element_by_name('q').send_keys(search_string)
driver.find_elements_by_name('btnK')[1].click()
time.sleep(INTERVAL)
Googleの画面を開いた後、name属性が’q’の要素に検索文字列を入力しています。’q’は検索テキストボックスです。
次に’btnK’をクリックしています。’btnK’は検索ボタンです。’btnK’のname属性を持つ要素は2つあるので、そのうち最後の方をクリックしています。
クリックすることで検索が走ります。
results = []
flag = False
while True:
g_ary = driver.find_elements_by_class_name('g')
for g in g_ary:
result = {}
result['url'] = g.find_element_by_class_name('yuRUbf').find_element_by_tag_name('a').get_attribute('href')
result['title'] = g.find_element_by_tag_name('h3').find_element_by_tag_name('span').text
results.append(result)
if len(results) >= 50:
flag = True
break
if flag:
break
driver.find_element_by_id('pnnext').click()
time.sleep(INTERVAL)
ちょっと長いですが、やっていることは「検索結果を50件分resultsリストに格納」しているだけです。
while Trueで無限ループしつつ、件数が50件に到達したらループを抜けています。
g_aryは検索結果のタイトルとURLが入った要素をリストで保持しています。
それをfor inでループし、タイトルとURLを中から取り出してresult辞書に格納後、resultsに一つずつ渡しています。
条件分岐の50の部分を変更することで、取得する件数を変更できます。
タイトルはh3タグのspanタグのtextから、URLはname属性が’yuRUbf’の要素の中のaタグのhref属性からそれぞれ取得しています。
これで検索結果を50件分取得できました。次は取得したデータをexcelに書き出します。
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet['A1'].value = 'タイトル'
sheet['B1'].value = 'URL'
Workbook()で新しいExcelファイルを作成しています。
新しく作成すると最初から「sheet」という名前のシートが作成され、そのシートがアクティブ状態になっているので、workbook.activeで「sheet」シートを取得します。
後はA1セルに「タイトル」B1セルに「URL」を書き込み、ヘッダを作成しています。
for row, result in enumerate(results, 2):
sheet[f"A{row}"] = result['title']
sheet[f"B{row}"] = result['url']
workbook.save(f"google_search_{search_string}.xlsx")
driver.close()
先ほど取得した50件分のデータを繰り返し、Excleの2行目から順に書き込んでいます。
enumerateの2つ目の引数に2を指定することで、row変数は2からインクリメントされています。
全て書き終わったら最後にファイル名を決めて保存し、driver.close()でブラウザを閉じています。
これで処理は完了です。同じ階層に検索結果のExcelファイルが作成されるので、確認してみましょう。