ミニプログラム

Google検索結果をエクセルに自動出力するプログラム

Google検索

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ファイルが作成されるので、確認してみましょう。

タイトルとURLをコピーしました