JavaScriptで動くWebサイトをスクレイピングしたいとき、PythonではSeleniumが定番です。

インストールから基本操作、実践テクニックまで一通りまとめました。



目次


1、インストール

2、基本の使い方

3、ヘッドレスモード(ブラウザ非表示)

4、要素の取得方法まとめ

5、待機処理(WaitとSleep)

6、スクリーンショット

7、ページ遷移・新しいタブ

8、スクロール

9、ページネーション対応

10、よく使うテクニック集



1. インストール


Selenium 4.x からは ChromeDriver の手動インストールが不要になりました。


pip install selenium

これだけで動きます。



2. 基本の使い方


from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

# ページを開く
driver.get("https://google.com")

# 検索ボックスに文字を入力して送信
elem = driver.find_element(By.NAME, "q")
elem.send_keys("Python Selenium")
elem.submit()

import time
time.sleep(3)

driver.quit()


3. ヘッドレスモード(ブラウザを表示しない)


サーバーやバックグラウンド実行のときはヘッドレスモードを使います。


from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(options=options)


4. 要素の取得方法まとめ


from selenium.webdriver.common.by import By

# ID で取得
driver.find_element(By.ID, "submit-btn")

# CSSセレクタで取得
driver.find_element(By.CSS_SELECTOR, ".item-title")

# XPathで取得(DevToolsで右クリック→Copy→Copy XPath)
driver.find_element(By.XPATH, '//*[@id="content"]/h1')

# class名で取得
driver.find_element(By.CLASS_NAME, "price")

# タグ名で全取得
links = driver.find_elements(By.TAG_NAME, "a")
for link in links:
print(link.get_attribute("href"))

# テキストを取得
text = driver.find_element(By.CSS_SELECTOR, "h1").text


5. 待機処理(Wait と Sleep)


ページの読み込みを待つには2種類の方法があります。


# 方法1: 固定時間待つ(シンプルだが遅い)
import time
time.sleep(3)

# 方法2: 要素が現れるまで待つ(推奨)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, 10) # 最大10秒待つ
element = wait.until(EC.presence_of_element_located((By.ID, "result")))


6. スクリーンショット


# ページ全体のスクリーンショット
driver.save_screenshot("screenshot.png")

# 特定要素だけ撮る
elem = driver.find_element(By.CSS_SELECTOR, ".main-content")
elem.screenshot("element.png")


7. ページ遷移・新しいタブ


# 新しいタブを開く
driver.execute_script("window.open('https://example.com', '_blank')")

# タブを切り替える
handles = driver.window_handles
driver.switch_to.window(handles[1]) # 2番目のタブに切り替え
driver.switch_to.window(handles[0]) # 元のタブに戻る

# iframeに切り替える
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
# iframeの外に戻る
driver.switch_to.default_content()


8. スクロール


# ページ最下部までスクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# 指定ピクセル分スクロール
driver.execute_script("window.scrollTo(0, 1000);")

# 特定要素が見えるところまでスクロール
elem = driver.find_element(By.CSS_SELECTOR, ".target")
driver.execute_script("arguments[0].scrollIntoView(true);", elem)


9. ページネーション対応


while True:
# 現在のページのデータを取得
items = driver.find_elements(By.CSS_SELECTOR, ".item")
for item in items:
print(item.text)

# 次へボタンがあればクリック、なければ終了
try:
next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page")
next_btn.click()
time.sleep(2)
except:
break


10. よく使うテクニック集


# ボタン・リンクのクリック
driver.find_element(By.CSS_SELECTOR, "#submit").click()

# テキストフィールドをクリアして入力
field = driver.find_element(By.ID, "search")
field.clear()
field.send_keys("新しいテキスト")

# セレクトボックスの操作
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, "dropdown"))
select.select_by_visible_text("オプション1")

# JavaScriptを直接実行
driver.execute_script("document.getElementById('btn').click();")

# 現在のURLを取得
print(driver.current_url)

# ページのタイトルを取得
print(driver.title)


Seleniumの基本はこれで一通りカバーできます。

エラーが出たときの対処法は別記事「Selenium エラー対処まとめ」を参照してください。