【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/」を参照してください。 wgetcurlコマンドでもダウンロードできますが、今回は割愛します。

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サイトからデータを収集したり、特定のアクションを実行したりするために役立ちますので、是非、使いこなしていきましょう。

【Python】Seleniumを使ったWebスクレイピングのサンプルコードを解説 | いっしー@Webエンジニア