logo
ダウンロード
languageJPdown
menu

PythonとSeleniumでスクレイピングする方法|動的ページの取得・待機処理・CSV保存まで解説

star

PythonとSeleniumを使ったWebスクレイピングのやり方を初心者向けに解説。Selenium Manager、WebDriverWait、CSSセレクター、クリック・入力・スクロール、CSV保存、Chromeブラウザの操作方法、空白データやTimeoutエラーの対処法まで紹介します。

約6分で読めます

PythonでWebスクレイピングを行う方法には、requestsやBeautifulSoupを使う方法、Scrapyを使う方法、そしてSeleniumでブラウザを自動操作する方法があります。

この中でSeleniumが特に役立つのは、JavaScriptによってデータが後から表示されるページや、検索条件の入力、ボタンのクリック、スクロールなど、ブラウザ上の操作が必要なページです。ブラウザではデータが見えているのに、通常のHTML取得では空白になる場合、Seleniumを使うことで取得できる可能性があります。

本記事では、PythonとSeleniumを使ったスクレイピングのやり方を、実務でつまずきやすいポイントに絞って解説します。環境構築、要素の取得、待機処理、CSV保存、クリック・スクロール操作、よくあるエラーの確認方法まで順番に見ていきましょう。

Seleniumとは?

Seleniumは、Chrome、Firefox、EdgeなどのWebブラウザをプログラムから操作できるオープンソースツールです。もともとはWebアプリケーションの自動テストでよく使われてきましたが、実際のブラウザを起動してページを表示できるため、動的なWebページのスクレイピングにも活用されています。

Seleniumでは、URLを開く、フォームに文字を入力する、ボタンをクリックする、ページをスクロールする、表示されたテキストやリンクを取得するといった操作をPythonコードで実行できます。

Seleniumを使うべきページ・使わなくてもよいページ

Pythonでスクレイピングする場合、すべてのページでSeleniumを使う必要はありません。Seleniumは便利ですが、実際のブラウザを起動するため、軽量なHTML取得よりも処理が重くなります。まずは対象ページの性質を確認し、必要な場合にだけSeleniumを使うのが効率的です。

ページの状態おすすめの方法理由
HTMLソースに必要なデータが含まれているrequests + BeautifulSoup軽くて速く、ブラウザ起動が不要
JavaScript実行後にデータが表示されるSelenium実際のブラウザで表示後のDOMを取得できる
検索フォーム、クリック、タブ切替が必要Selenium人間の操作に近いブラウザ操作を自動化できる
APIや公式データ提供があるAPI利用を優先安定性・合法性・メンテナンス性が高い
短時間に大量取得したい取得範囲と頻度を再設計Seleniumだけで大量取得すると負荷やエラーが出やすい

Seleniumでスクレイピングする前に確認すること

  • 対象サイトの利用規約やrobots.txtを確認する
  • ログインが必要なページの場合、取得・利用が許可されているデータか確認する
  • ページの「ソースを表示」とChrome DevToolsの「Elements」で、データの表示タイミングを比べる
  • Networkタブで公式APIやXHR通信が使えるか確認する
  • 取得対象を必要最小限に絞り、アクセス間隔を空ける

特に「ブラウザでは見えるのに、取得結果が空白になる」場合は、ページ読み込み直後にはデータが存在せず、JavaScript実行後に追加されている可能性があります。このようなケースでは、Seleniumでページを開いたあと、必要な要素が表示されるまで待機してから取得することが重要です。

Seleniumのユースケース・活用事例

次に、Seleniumがよく使われる場面を紹介します。Seleniumは、単にHTMLを取得するだけでなく、ブラウザ上の操作を伴うページで特に力を発揮します。

  • ログイン処理を含むスクレイピング
    ID・パスワードの入力やログインボタンのクリックなど、人間が行う一連の操作を自動化できます。ログイン後に表示されるページのデータ取得を検討する場合に役立ちます。
  • 無限スクロールページの対応
    SNSやECサイトに多い「下までスクロールすると次のデータが読み込まれる」形式のページでも、スクロール操作を自動化することでデータを取得しやすくなります。
  • Webアプリケーションの自動テスト
    テストケースを作成し、Seleniumでテストスクリプトを実行することで、ブラウザ上での操作確認を自動化できます。

Seleniumに関するよくある質問

ここでは、SeleniumでWebスクレイピングを行う際によくある質問と注意点をまとめます。

  • Seleniumでスクレイピングをしたらバレる?
    アクセス頻度が高すぎる場合や、不自然な操作パターンがある場合、Webサイト側に自動アクセスとして検出される可能性があります。また、スクレイピングを行う際は、対象サイトの利用規約やrobots.txt、著作権・個人情報の取り扱いにも注意が必要です。
    関連記事:スクレイピングは違法?Webスクレイピングに関するよくある誤解!
  • Seleniumの弱点は?
    Seleniumは、ブラウザ操作を自動化するためのフレームワークです。そのため、ブラウザ外の処理や軽量なHTML取得には、RequestsやBeautifulSoupなど他のPythonライブラリと併用するほうが適している場合があります。
  • Seleniumは重いと聞きましたが、本当ですか?
    はい。Seleniumは実際のブラウザを起動して操作するため、RequestsやBeautifulSoupのような軽量ライブラリと比べると動作は重くなりやすいです。その分、動的ページや操作が必要なページに対応しやすいというメリットがあります。

PythonとSeleniumの環境構築

まずはPythonとSeleniumを準備します。Pythonがインストールされているか確認するには、コマンドプロンプトまたはターミナルで次のコマンドを実行します。

python --version

Pythonのバージョンが表示されれば準備できています。次にSeleniumをインストールします。

pip install selenium

Selenium 4.6以降では、Selenium ManagerによりChromeDriverなどのブラウザドライバー管理が自動化されています。そのため、基本的にはChromeDriverを手動でダウンロードしなくても、以下のようにChromeを起動できます。

from selenium import webdriver

# Selenium Managerにより、対応するドライバーが自動管理されます。
driver = webdriver.Chrome()
driver.get("https://www.example.com/")
print(driver.title)
driver.quit()

社内ネットワークやプロキシ環境などでドライバーの自動取得がうまくいかない場合は、手動でChromeDriverを指定する方法や、webdriver-managerを使う方法も検討できます。ただし、まずは最新のSeleniumで上記のシンプルなコードを試すのがおすすめです。

Seleniumの基本操作

操作コード例用途
ページを開くdriver.get(“URL”)対象ページへアクセスする
要素を探すdriver.find_element(By.CSS_SELECTOR, “.item”)1つの要素を取得する
複数要素を探すdriver.find_elements(By.CSS_SELECTOR, “.item”)一覧データをまとめて取得する
テキスト取得element.text画面に表示されている文字を取得する
属性取得element.get_attribute(“href”)リンクURLや画像URLを取得する
クリックelement.click()ボタンやリンクを押す
入力element.send_keys(“キーワード”)検索フォームに文字を入力する
スクロールdriver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”)下部読み込みや遅延表示を確認する

Selenium 4では、要素の指定に By を使う書き方が基本です。古い記事で見かける find_element_by_id や find_element_by_class_name のような書き方ではなく、以下のように記述します。

from selenium.webdriver.common.by import By

item = driver.find_element(By.CSS_SELECTOR, ".item")
items = driver.find_elements(By.CSS_SELECTOR, ".item")

実践1:JavaScriptで表示されるデータを取得する

ここでは、学習用サイト「Quotes to Scrape」のJavaScript版ページを例に、Seleniumで表示後のデータを取得し、CSVに保存する流れを紹介します。実際の業務サイトで試す場合は、必ず利用規約、アクセス頻度、著作権、個人情報の取り扱いを確認してください。

取得するデータ

  • 引用文
  • 著者名
  • タグ

サンプルコード

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import csv

url = "https://quotes.toscrape.com/js/"

driver = webdriver.Chrome()

try:
    driver.get(url)

    wait = WebDriverWait(driver, 10)
    wait.until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".quote"))
    )

    rows = []
    quote_blocks = driver.find_elements(By.CSS_SELECTOR, ".quote")

    for block in quote_blocks:
        text = block.find_element(By.CSS_SELECTOR, ".text").text
        author = block.find_element(By.CSS_SELECTOR, ".author").text
        tags = [tag.text for tag in block.find_elements(By.CSS_SELECTOR, ".tag")]

        rows.append({
            "text": text,
            "author": author,
            "tags": ", ".join(tags)
        })

    with open("quotes.csv", "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.DictWriter(f, fieldnames=["text", "author", "tags"])
        writer.writeheader()
        writer.writerows(rows)

    print(f"{len(rows)}件のデータを保存しました。")

except TimeoutException:
    print("指定した要素が時間内に表示されませんでした。")

finally:
    driver.quit()

コードのポイント

  • webdriver.Chrome() でChromeを起動します。Selenium 4.6以降では、基本的にSelenium Managerがドライバーを自動管理します。
  • WebDriverWait を使い、.quote 要素が表示されるまで待機します。
  • find_elements で引用ブロックをまとめて取得し、各ブロック内から引用文、著者名、タグを取り出します。
  • CSVはExcelで開きやすいように utf-8-sig で保存します。
  • finally で driver.quit() を実行し、処理終了時にブラウザを閉じます。

time.sleepではなくWebDriverWaitを使う理由

初心者向けのサンプルでは time.sleep(3) のように固定秒数待つコードもよく見かけます。しかし、動的ページでは回線速度やサーバー応答、JavaScriptの実行タイミングによって、データが表示されるまでの時間が変わります。

そのため、実務では「3秒待つ」のではなく、「必要な要素が表示されるまで最大10秒待つ」という考え方にしたほうが安定します。これがWebDriverWaitです。

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)
items = wait.until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".item"))
)

Selenium公式ドキュメントでも、明示的な待機処理では WebDriverWait を使い、条件が満たされるまで待つ形が紹介されています。固定秒数の待機だけに頼ると、ページによっては速すぎたり遅すぎたりするため、取得漏れや無駄な待機が発生しやすくなります。

クリック・入力・スクロールが必要な場合

Seleniumの強みは、単にHTMLを取得するだけでなく、ブラウザ上の操作を自動化できる点です。検索条件を入力する、ボタンを押す、下までスクロールするなど、人間が画面上で行う操作をコード化できます。

検索フォームに入力する例

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

search_box = driver.find_element(By.NAME, "q")
search_box.clear()
search_box.send_keys("Selenium Python")
search_box.send_keys(Keys.ENTER)

ボタンをクリックする例

button = driver.find_element(By.CSS_SELECTOR, “.search-button”)
button.click()

ページ下部までスクロールする例

driver.execute_script(
“window.scrollTo(0, document.body.scrollHeight);”
)

無限スクロール型ページでは、1回スクロールしただけでは全データが表示されないことがあります。その場合は、スクロール後に新しい要素が増えたか確認しながら繰り返す必要があります。ただし、必要以上にスクロールを繰り返すと対象サイトに負荷をかけるため、取得件数や実行回数の上限を決めておきましょう。

CSSセレクターを選ぶコツ

Seleniumでデータを取得する際は、どの要素を取得するかをCSSセレクターやXPathで指定します。安定したスクレイピングには、セレクター選びが重要です。

セレクター特徴
ID#product-title一意であれば安定しやすい
class.price複数要素の取得に便利。ただしデザイン変更で変わることがある
属性a[href]リンクや画像など、属性を持つ要素の抽出に便利
親子関係.item .name一覧内の特定項目を取りたいときに使いやすい
XPath//div[@class=”item”]複雑な条件指定ができるが、長すぎるとメンテナンスしにくい

Chrome DevToolsで対象要素を確認し、できるだけ意味のあるclass名やdata属性を使うと、ページ変更の影響を受けにくくなります。自動生成されたような長いclass名や、階層に依存しすぎるXPathは、ページの小さな変更で壊れやすいため注意が必要です。

実践2【サンプルコード付き】SeleniumでChromeブラウザを操作する方法

ChromeDriverのインストール

SeleniumでChromeブラウザを操作するには、「ChromeDriver」と呼ばれる専用ドライバーが必要です。手動でインストールする場合は、まず自分のChromeのバージョンを確認し、以下の公式サイトから対応するChromeDriverをダウンロードします。

Chrome Driver: https://chromedriver.chromium.org/downloads

ダウンロードしたzipファイルを解凍し、chromedriverという名前の実行ファイルが確認できれば準備完了です。なお、後述のサンプルコードではwebdriver-managerを利用するため、環境によってはChromeDriverを自動で管理できます。

Chromeブラウザを自動起動してGoogleを開く

それでは、実際にブラウザを自動起動してWebページを開いてみましょう。

以下は、Googleのトップページを表示させる基本的なスクリプトです。テキストエディタを起動し、ファイルを「.py」という拡張子で保存します。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time

# Chromeドライバの自動ダウンロード&起動
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# Googleを開く
driver.get("https://www.google.com")

# 数秒待って終了(目視確認用)
time.sleep(5)

# ブラウザを閉じる
driver.quit()

コマンドプロンプトを起動し、保存したファイルのあるディレクトリへ移動したうえで「python ◯◯.py」と入力して実行します。

以下のようなウィンドウが表示されれば成功です。

Google検索結果を取得する

次に、任意のキーワードでGoogle検索を行う操作を自動化してみましょう。

以下のコードをコピペして実行してください。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

# Chromeのオプション設定
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled") # Bot対策
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")

# ドライバー起動
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

# Google(日本版)を開く
driver.get("https://www.google.co.jp/")

# 検索フォームを探す
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium Python")
search_box.send_keys(Keys.RETURN)

# ユーザーが手動で見るまで終了しない
input("検索完了。確認したらEnterを押して終了:")

# ブラウザを閉じる
driver.quit()

以下のように、自動で検索結果画面まで遷移すれば成功です。

Octoparseでスクレイピングする方法(Selenium不要)

Seleniumは柔軟性の高い方法ですが、環境構築やコードの作成、サイト変更時のメンテナンスが必要になります。より手軽にWebスクレイピングを始めたい場合は、ノーコードツールの「Octoparse」を使う方法もあります。

Octoparseでは、画面上の操作だけで取得したいデータを指定できるため、プログラミングの知識がない方でもデータ収集を始めやすいのが特徴です。ここでは、既存の画面イメージに沿って基本的な操作手順を紹介します。

  • URLの入力
    Octoparseを起動し、検索ウィンドウからスクレイピングしたいWebページのURLを入力します。その後、「スタート」をクリックします。
  • データ検出
    「ウェブページのデータを自動検出」を選択します。すると、ページ上のデータが自動的に検出されます。
    「次のページ」や「スクロールダウン」後の情報も取得したい場合は、操作提案上の指示に従ってスクロールダウンやページネーションを設定できます。

よくあるエラーと確認ポイント

症状よくある原因確認・対処
取得結果が空白になるJavaScript表示前に取得しているWebDriverWaitで対象要素の表示を待つ
NoSuchElementExceptionセレクターが間違っている、要素がまだ表示されていないDevToolsでセレクターを確認し、待機処理を追加する
TimeoutException指定した要素が時間内に表示されないURL、セレクター、読み込み条件、ログイン状態を確認する
ElementClickInterceptedException別の要素やポップアップが重なっているポップアップを閉じる、スクロールしてからクリックする
文字化けするCSVの文字コードがExcel向けでないutf-8-sigで保存する
403・429・CAPTCHAが出るアクセス頻度が高い、対象サイトの制限に触れている取得範囲、待機時間、同時実行数、利用規約を見直す

ヘッドレスモードで実行する方法

ブラウザ画面を表示せずに実行したい場合は、ヘッドレスモードを使えます。サーバー上で定期実行したい場合や、画面を開かずに処理したい場合に便利です。

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

options = Options()
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
driver.get("https://www.example.com/")
print(driver.title)
driver.quit()

ただし、ヘッドレスモードでは通常表示と挙動が異なるサイトもあります。まずは画面ありで動作を確認し、正常に取得できることを確認してからヘッドレスモードに切り替えるとよいでしょう。

Seleniumでスクレイピングするときの注意点

  • 検知を無理に回避することを目的にせず、対象サイトへの負荷を抑えた設計にする
  • 短時間に大量アクセスせず、待機時間や取得件数の上限を設定する
  • 画像、口コミ、記事本文、個人情報などを扱う場合は、利用目的と権利関係を確認する
  • 対象サイトにAPIやデータ提供サービスがある場合は、そちらを優先する
  • HTML構造が変わるとセレクターが使えなくなるため、定期的なメンテナンスを前提にする

まとめ

本記事では、PythonとSeleniumを使ったWebスクレイピングの基本機能や実施方法について解説しました。Seleniumは、ブラウザ操作を自動化できるため、JavaScriptで表示される動的ページや操作が必要なページのデータ取得に向いています。

一方で、Seleniumを使うにはPythonの基礎知識や環境構築が必要です。できるだけ手軽にWebスクレイピングを始めたい場合は、Octoparseのようなノーコードツールを使う方法もあります。目的やスキルに応じて、自分に合った方法を選びましょう。

競合情報も営業リストも、ウェブデータをそのままExcel・CSV・Google Sheetsに出力

コード不要、誰でも今日から。クリック操作だけで必要な項目を自動抽出

Google Maps・食べログ・iタウンページ向けテンプレートで、リード獲得をすぐに開始

クラウドで毎日・毎週自動実行。大量取得でも安定して、競合動向を常に把握

MCP対応でAIエージェントと連携。収集データをAIに渡して分析・活用まで一気通貫

クレジットカード不要で無料スタート。世界600万人以上が選んだ信頼のツール

クリックだけでウェブ データを取得
無料ダウンロード

人気記事

トピックを検索する

今すぐOctoparseを始めて、業務効率化を実現しましょう。

ダウンロード

関連記事