<p>JavaScriptで動くWebサイトをスクレイピングしたいとき、Pythonでは<strong>Selenium</strong>が定番です。<br>
インストールから基本操作、実践テクニックまで一通りまとめました。</p>
<h3 id="h_toc">目次</h3>
<p>1、インストール<br>
2、基本の使い方<br>
3、ヘッドレスモード(ブラウザ非表示)<br>
4、要素の取得方法まとめ<br>
5、待機処理(WaitとSleep)<br>
6、スクリーンショット<br>
7、ページ遷移・新しいタブ<br>
8、スクロール<br>
9、ページネーション対応<br>
10、よく使うテクニック集</p>
<h3 id="h_install">1. インストール</h3>
<p>Selenium 4.x からは ChromeDriver の手動インストールが不要になりました。</p>
<pre><code>pip install selenium</code></pre>
<p>これだけで動きます。</p>
<h3 id="h_basic">2. 基本の使い方</h3>
<pre><code>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()</code></pre>
<h3 id="h_headless">3. ヘッドレスモード(ブラウザを表示しない)</h3>
<p>サーバーやバックグラウンド実行のときはヘッドレスモードを使います。</p>
<pre><code>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)</code></pre>
<h3 id="h_find">4. 要素の取得方法まとめ</h3>
<pre><code>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</code></pre>
<h3 id="h_wait">5. 待機処理(Wait と Sleep)</h3>
<p>ページの読み込みを待つには2種類の方法があります。</p>
<pre><code># 方法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")))</code></pre>
<h3 id="h_screenshot">6. スクリーンショット</h3>
<pre><code># ページ全体のスクリーンショット
driver.save_screenshot("screenshot.png")
# 特定要素だけ撮る
elem = driver.find_element(By.CSS_SELECTOR, ".main-content")
elem.screenshot("element.png")</code></pre>
<h3 id="h_tab">7. ページ遷移・新しいタブ</h3>
<pre><code># 新しいタブを開く
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()</code></pre>
<h3 id="h_scroll">8. スクロール</h3>
<pre><code># ページ最下部までスクロール
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)</code></pre>
<h3 id="h_paging">9. ページネーション対応</h3>
<pre><code>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</code></pre>
<h3 id="h_tips">10. よく使うテクニック集</h3>
<pre><code># ボタン・リンクのクリック
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)</code></pre>
<p>Seleniumの基本はこれで一通りカバーできます。<br>
エラーが出たときの対処法は別記事「<a href="/blog/javascript/yp5fd7ykwg">Selenium エラー対処まとめ</a>」を参照してください。</p>