こんにちは、ワタルです。
今回は、Pythonを使ったスクレイピングを行なっていきます。
SEO対策などのマーケティングツールとして非常に便利ですので、
WEBデザイナー、マーケターにもオススメな技術です。
目次
Seleniumとは?
PythonのライブラリであるSeleniumは、簡単に言うと「検索結果を取得するライブラリ」です。
ChromeDriverを今回は使って進めていきます。
SeleniumとChromeDriverのインストールが未だの方はコチラ
参考:初心者でも簡単にできるSeleniumのインストール(ジコログさん)
1 2 | python -V python 3.9.12 |
1 2 | $pip list selenium 4.3.0 |
こちらのバージョンで動かしていきます。
今回のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import time from unittest import result from openpyxl import Workbook import openpyxl from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains #マウスオーバー #検索したい文字 search_word = '東京 観光地' #Seleniumを使う設定とGoogleへの遷移 REST = 4 URL = "https://google.com/" driver_path = "./chromedriver" driver = webdriver.Chrome(service=Service(driver_path)) driver.maximize_window time.sleep(REST) driver.get(URL) time.sleep(REST) #文字を入力して検索の挙動 driver.find_element(by=By.NAME, value='q').send_keys(search_word) element = driver.find_elements(by=By.NAME, value='btnK')[1] driver.execute_script('arguments[0].click();', element) time.sleep(REST) #検索結果を取得 results = [] flag = False while True: go_ary = driver.find_elements(by=By.CLASS_NAME, value='g') for g in go_ary: result = {} result['url'] = g.find_element(by=By.CLASS_NAME, value='yuRUbf').find_element(by=By.TAG_NAME, value='a').get_attribute('href') result['title'] = g.find_element(by=By.TAG_NAME, value='h3').text results.append(result) if len(results) >= 10: flag = True break if flag: break driver.find_element(by=By.ID, value='pnnext').click() time.sleep(REST) #ワークブックの作成 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_word}.xlsx") driver.quit() |
こちらが今回のコード全覧です。
『東京 観光地』で検索をかけ、上位表示10件のタイトルとURLをエクセルのデータとして保存させるようにコードを書いています。
結果はこうなります。
もう東京の観光地探しに困ることはなさそうです。
上位10位まで、全てまとめサイトになっているのがわかりますね。
コード解説
1 2 3 4 5 6 7 8 | import time from unittest import result from openpyxl import Workbook import openpyxl from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains #マウスオーバーのアクション |
time は、Chrome操作中の動きに休む時間を設けるために使います。(人の動きを再現)
openpyxlは、Python上でExcelを操作するためのライブラリです。
1 | search_word = '東京 観光地' |
今回は、『東京 観光地』で検索します。
1 2 3 4 5 6 7 8 | REST = 4 URL = "https://google.com/" driver_path = "./chromedriver" driver = webdriver.Chrome(service=Service(driver_path)) driver.maximize_window time.sleep(REST) driver.get(URL) time.sleep(REST) |
Chromeの操作です。
ウインドウを広げて、GoogleのTOP(検索画面)を開きます。
休み時間は4秒に設定しました。
./chromedriverについては、ご自身のパスに応じて適宜変更してください。
僕の場合はChromeDriverを同じ階層に設置したので、上のようになっています。
1 2 3 4 5 | driver.find_element(by=By.NAME, value='q').send_keys(search_word) element = driver.find_elements(by=By.NAME, value='btnK')[1] driver.execute_script('arguments[0].click();', element) time.sleep(REST) |
googleの検索ワード入力部分「name=”q”」に検索ワードを.send_keysで送信します。
次に、「name=”btnk”」を持つ1つ目の箇所(検索ボタン)をクリックさせます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | results = [] flag = False while True: go_ary = driver.find_elements(by=By.CLASS_NAME, value='g') for g in go_ary: result = {} result['url'] = g.find_element(by=By.CLASS_NAME, value='yuRUbf').find_element(by=By.TAG_NAME, value='a').get_attribute('href') result['title'] = g.find_element(by=By.TAG_NAME, value='h3').text results.append(result) if len(results) >= 10: flag = True break if flag: break driver.find_element(by=By.ID, value='pnnext').click() time.sleep(REST) |
現時点のGoogleの検索画面上では
class=’yuRUbf’にはURLの情報が、
h3にはタイトルの情報が格納されていますので、それらを10件取得するように指示します。
10の件数を変更すれば、50件でも100件でも取得が可能です。
指定した件数まで、ループさせる処理をしています。
1 2 3 4 | workbook = openpyxl.Workbook() sheet = workbook.active sheet['A1'].value = 'タイトル' sheet['B1'].value = 'URL' |
openpyxlを使い、Excelを操作していきます。
A1には「タイトル」という文字をいれ、下にタイトルが格納させていきます。
B1には、同じように「URL」というタイトルをつけます。
1 2 3 4 5 | for row, result in enumerate(results, 2): sheet[f"A{row}"] = result['title'] sheet[f"B{row}"] = result['url'] workbook.save(f"google_{search_word}.xlsx") |
Aの列には取得したタイトルを、Bには取得したURLを入れていきます。
そして、「google_東京_観光地.xlsx」という名前でファイルを保存します。
1 | driver.quit() |
Chormeを閉じます。
これで以上です。
結果は最初にお見せした通り、エクセルのデータが出力されているのがわかります。
スクレイピングには注意を!
とても便利なスクレイピングですが、注意が必要です。
目的が「情報解析」の場合にはあまり問題はありませんが、それ以外での利用方法については規約を確認しましょう。
スクレイピング自体を禁止しているサイトも多数ありますので、使用される際は細心の注意を払って使いましょう!
それでは、また。
(いい声)