【Python】Seleniumを使ったWebスクレイピングのサンプルコードを解説
開発環境
- Python version: python 3.10.11
- selenium: 4.17.2
Pythonのseleniumとは
Seleniumは、Webブラウザを自動的に制御してWebアプリケーションのテストやスクレイピングを行うためのツールとして広く使用されているプログラミングフレームワークです。 2004年にJason Hugginsによって作られたSeleniumは、JavaScriptを使用してWebページのテストを自動化するためのツールとして開発されました。 その後、Selenium WebDriverが導入されたことによってブラウザを直接制御できるようになり、より広範で効果的なWebブラウザ自動化ツールとして広く利用されるようになりました。 Seleniumは様々なプログラミング言語向けにバインディングやラッパーが提供されており、Python言語向けにSeleniumを使用するためのラッパーやバインディングも提供されています。 公式ドキュメント:https://www.selenium.dev/ja/documentation/
Pythonのseleniumの使い方
Pythonのseleniumの使い方を解説していきます。
Seleniumをインストール
まずはSeleniumをインストールするために下記のコマンドを実行します。
1pip install selenium
WebDriverのインストール
次にWebDriverのインストールをしていきます。
GoogleChromeWebDriverは「https://chromedriver.chromium.org/downloads」からダウンロードすることができます。
Chrome バージョン 115 以降を使用している場合は、Chrome for Testingの可用性ダッシュボード「https://googlechromelabs.github.io/chrome-for-testing/」を参照してください。
wget
やcurl
コマンドでもダウンロードできますが、今回は割愛します。
WebDriverを適切な場所に移動
次にダウンロードしたWebDriverを適切な場所に移動します。
Linuxであれば「/usr/local/bin/
」配下に設置することが一般的ですが、pythonの実行ファイルの直下などでも問題ありません。
※今回のGoogleChromeWebDriverであればmacやlinuxは「chromedriver」、Windowsであれば「chromedriver.exe」ファイルです。
これで準備完了です。
Pythonのseleniumでスクレイピングする
次にPythonのseleniumでスクレイピングするサンプルコードを解説しています。
スクレイピングのサンプルコード
下記はSeleniumを使用してGoogleでキーワード検索を行い、検索結果からタイトル、URLなどの情報を取得する簡単なウェブスクレイピングのサンプルコードです。
1from selenium import webdriver 2from selenium.webdriver.chrome.service import Service 3from selenium.webdriver.common.by import By 4from selenium.webdriver.common.keys import Keys 5from selenium.webdriver.support.ui import WebDriverWait 6from selenium.webdriver.support import expected_conditions as EC 7import time 8 9# WebDriverインスタンスを作成 10service = Service(executable_path='./chromedriver.exe') 11driver = webdriver.Chrome(service=service) 12 13# URLにアクセス 14target_url = 'https://www.google.co.jp/' 15driver.get(target_url) 16 17# ページが完全に読み込まれるまで待機(最大で10秒) 18wait = WebDriverWait(driver, 10) 19search_box = wait.until(EC.presence_of_element_located((By.ID, 'APjFqb'))) 20 21# 検索ボックスを見つけてキーワードを入力し、Enterを押す 22search_box = driver.find_element(By.ID, 'APjFqb') 23search_box.send_keys('スクレイピング') 24search_box.send_keys(Keys.RETURN) 25 26# ページが完全に読み込まれるまで待機(最大で10秒) 27wait = WebDriverWait(driver, 10) 28search_result = wait.until(EC.presence_of_element_located((By.ID, 'center_col'))) 29 30# 検索結果の一覧からタイトルとURLを取得する 31elements = driver.find_elements(By.CLASS_NAME, 'MjjYud') 32list = [] 33 34for element in elements: 35 exclusion = element.find_elements(By.CLASS_NAME, 'oIk2Cb') 36 if len(exclusion) > 0: 37 continue 38 39 date = { 40 'site': element.find_element(By.CLASS_NAME, 'VuuXrf').text, 41 'title': element.find_element(By.CSS_SELECTOR, 'h3.LC20lb.MBeuO.DKV0Md').text, 42 'url': element.find_element(By.CSS_SELECTOR, 'a[jsname="UWckNb"]').get_attribute('href'), 43 } 44 45 list.append(date) 46 47# 最後に全体を出力 48print(list) 49 50# ブラウザを閉じる 51driver.quit()
WebDriverのインスタンスを作成
下記のコードではWebDriverのインスタンスを作成し、ChromeDriverを指定してChromeブラウザを起動します。
1service = Service(executable_path='./chromedriver.exe') 2driver = webdriver.Chrome(service=service)
Seleniumは自動的にインストールされたChromeDriverを探して使用してくれますが、特定のChromeDriverバージョンが必要な場合や、カスタム設定が必要な場合はexecutable_path
を使用します。
Googleの検索ページにアクセス
下記はGoogleの検索ページにアクセスしています。
1target_url = 'https://www.google.co.jp/' 2driver.get(target_url)
キーワードを入力して検索を実行
下記はキーワードを入力して検索を実行しています。
1wait = WebDriverWait(driver, 10) 2search_box = wait.until(EC.presence_of_element_located((By.ID, 'APjFqb'))) 3search_box = driver.find_element(By.ID, 'APjFqb') 4search_box.send_keys('スクレイピング') 5search_box.send_keys(Keys.RETURN)
また、WebDriverWait
を使用する子により、検索ボックスが読み込まれるまで待機するように制御しています。
検索結果が読み込まれるまで待機
下記は検索結果が読み込まれるまで待機しています。
1wait = WebDriverWait(driver, 10) 2search_result = wait.until(EC.presence_of_element_located((By.ID, 'center_col')))
検索結果が読み込まれるまでに次の処理が行われた場合、要素が見つからずエラーになることがあるので注意しましょう。
検索結果の一覧から各要素の情報を取得
下記は検索結果の一覧から各要素の情報(サイト名、タイトル、URL)を取得し、データをリストに追加しています。
1elements = driver.find_elements(By.CLASS_NAME, 'MjjYud') 2data_list = [] 3 4for element in elements: 5 # "oIk2Cb"というクラスが存在する場合は除外 6 exclusion = element.find_elements(By.CLASS_NAME, 'oIk2Cb') 7 if len(exclusion) > 0: 8 continue 9 10 data = { 11 'site': element.find_element(By.CLASS_NAME, 'VuuXrf').text, 12 'title': element.find_element(By.CSS_SELECTOR, 'h3.LC20lb.MBeuO.DKV0Md').text, 13 'url': element.find_element(By.CSS_SELECTOR, 'a[jsname="UWckNb"]').get_attribute('href'), 14 } 15 16 data_list.append(data)
要素を取得する方法はHTML要素のid属性、name属性、class属性、タグ名のほかに XPathクエリやCSSセレクタなどがあります。
取得したデータを出力
最後に全体のデータを出力し、ブラウザを閉じます。
1print(data_list) 2driver.quit()
おわりに
今回はPythonでSeleniumを使ったスクレイピングの方法について解説していきましたが、いかがだったでしょうか。 SeleniumはWebテスト自動化のために開発されたライブラリではりますが、WebスクレイピングなどHTMLを解析してWebページから情報を抽出するためにも使用できます。 特定のWebサイトからデータを収集したり、特定のアクションを実行したりするために役立ちますので、是非、使いこなしていきましょう。