ウェブは、昔とはすっかり様変わりしました。今では、ほとんどのサイトが JavaScript で動いていて、コンテンツはその都度読み込まれます。たとえば、無限スクロール、ポップアップ、そして 1〜2 回クリックしないと中身が見えないダッシュボードなどです。実際、 ため、静的 HTML を読むだけの昔ながらのスクレイピングツールでは、価値あるデータをかなり取りこぼしてしまいます。最新の EC サイトから商品価格を取得しようとしたり、インタラクティブな地図から不動産一覧を集めようとしたことがあるなら、そのもどかしさはよくご存じでしょう。欲しいデータが、ソースコードの中にはそもそも存在しないのです。
そこで登場するのが Selenium を使ったスクレイピングです。私は長年にわたって自動化ツールを作り続けてきましたし、もちろんかなり多くのサイトもスクレイピングしてきました。その経験からはっきり言えるのは、Selenium を使いこなすことは、最新かつ動的なデータが必要な人にとって大きな武器になるということです。この実践的な Selenium ウェブスクレイピング入門では、セットアップから自動化までの重要な手順を順に解説し、さらに と組み合わせて、構造化されていてそのまま出力できるデータを作る方法も紹介します。ビジネスアナリストでも、営業担当でも、あるいは Python に少し興味があるだけの人でも、実用的なスキルと少しの笑いを持ち帰れるはずです(XPath セレクターのデバッグが人間を鍛える、というのはもはや定説です)。
Selenium とは何か? そしてなぜウェブスクレイピングに使うのか?
まずは基本からいきましょう。 はオープンソースのフレームワークで、コードを使って Chrome や Firefox のような実際のウェブブラウザを操作できます。ページを開く、ボタンをクリックする、フォームに入力する、スクロールする、さらには JavaScript を実行することまで、人間のユーザーと同じようにできる“ロボット”だと考えてください。これはとても重要です。というのも、現代のウェブサイトの多くは、最初からすべてのデータを見せてくれるわけではないからです。多くの場合、ページとやり取りしたあとにコンテンツが動的に読み込まれます。
なぜスクレイピングでこれが重要なのでしょうか? BeautifulSoup や Scrapy のような従来ツールは静的 HTML には強いものの、ページの初回読み込み後に JavaScript で追加された内容を見ることはできません。一方 Selenium は、ページとリアルタイムでやり取りできます。そのため、次のような用途に最適です。
- 「もっと見る」をクリックしたあとに表示される商品一覧の取得
- 動的に更新される価格やレビューの収集
- ログインフォーム、ポップアップ、無限スクロールの操作
- ダッシュボード、地図、その他のインタラクティブ要素からのデータ抽出
要するに、Selenium はページの読み込み完了後、あるいはユーザー操作のあとにしか表示されないデータをスクレイピングしたいときの第一候補です。
Python と Selenium を使ったウェブスクレイピングの重要ステップ
Selenium を使ったスクレイピングは、基本的に次の 3 つの重要なステップに分かれます。
| ステップ | やること | 重要な理由 |
|---|---|---|
| 1. 環境セットアップ | Selenium、WebDriver、Python ライブラリをインストールする | ツールを使えるようにして、セットアップのつまずきを減らすため |
| 2. 要素の特定 | ID、クラス、XPath などを使って欲しいデータを見つける | JavaScript に隠れていても、必要な情報を正確に狙えるため |
| 3. データの抽出と保存 | テキスト、リンク、表を取り出して CSV/Excel に保存する | 生のウェブデータを実際に使える形にするため |
では、各ステップを実践例と一緒に見ていきましょう。コピーして少し直せば、そのまま使えて、友達に自慢できるはずです。
ステップ 1: Python と Selenium の環境を整える
まず必要なのは、Selenium とブラウザドライバー(Chrome なら ChromeDriver など)をインストールすることです。朗報は、以前よりずっと簡単になったということです。
Selenium をインストールする
ターミナルを開いて、次を実行します。
1pip install selenium
WebDriver を入手する
- Chrome: をダウンロードします(Chrome のバージョンと一致していることを確認してください)。
- Firefox: をダウンロードします。
ワンポイント: Selenium 4.6 以降では Selenium Manager を使ってドライバーを自動ダウンロードできるので、もう PATH 変数をいじる必要すらないかもしれません()。
最初の Selenium スクリプト
Selenium の “Hello, world!” はこんな感じです。
1from selenium import webdriver
2driver = webdriver.Chrome() # または webdriver.Firefox()
3driver.get("https://example.com")
4print(driver.title)
5driver.quit()
トラブルシューティングのヒント:
- 「driver not found」エラーが出る場合は、PATH を確認するか Selenium Manager を使ってください。
- ブラウザとドライバーのバージョンが一致していることを確認してください。
- GUI のないヘッドレスサーバーで動かす場合は、下のヘッドレスモードのヒントを参照してください。
ステップ 2: データ抽出のためにウェブ要素を特定する
ここからが面白いところです。Selenium に「どのデータが欲しいのか」を伝えます。ウェブサイトは div、span、table などの要素で構成されており、Selenium にはそれらを見つける複数の方法があります。
よく使う検索方法
By.ID: 一意の ID を持つ要素を見つけるBy.CLASS_NAME: CSS クラスで要素を見つけるBy.XPATH: XPath 式を使う(非常に柔軟ですが、壊れやすいこともある)By.CSS_SELECTOR: CSS セレクターを使う(複雑な条件に便利)
使い方はこんな感じです。
1from selenium.webdriver.common.by import By
2# ID で探す
3price = driver.find_element(By.ID, "price").text
4# XPath で探す
5title = driver.find_element(By.XPATH, "//h1").text
6# CSS セレクターで商品画像をすべて探す
7images = driver.find_elements(By.CSS_SELECTOR, ".product img")
8for img in images:
9 print(img.get_attribute("src"))
ワンポイント: できるだけシンプルで安定した locator を使いましょう(ID > class > CSS > XPath)。また、データの読み込みに少し時間がかかるページをスクレイピングする場合は、明示的な待機を使うのが基本です。
1from selenium.webdriver.support.ui import WebDriverWait
2from selenium.webdriver.support import expected_conditions as EC
3wait = WebDriverWait(driver, 10)
4price_elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".price")))
こうしておけば、データの表示が少し遅れてもスクリプトが落ちにくくなります。
ステップ 3: データを抽出して保存する
要素を見つけたら、次はデータを取り出して、使いやすい場所に保存します。
テキスト、リンク、表を抽出する
たとえば、商品一覧の表をスクレイピングする場合はこうです。
1data = []
2rows = driver.find_elements(By.XPATH, "//table/tbody/tr")
3for row in rows:
4 cells = row.find_elements(By.TAG_NAME, "td")
5 data.append([cell.text for cell in cells])
Pandas で CSV に保存する
1import pandas as pd
2df = pd.DataFrame(data, columns=["名前", "価格", "在庫"])
3df.to_csv("products.csv", index=False)
Excel に保存することもできますし(df.to_excel("products.xlsx"))、API を使って Google Sheets に送ることもできます。
完全な例: 商品タイトルと価格をスクレイピングする
1from selenium import webdriver
2from selenium.webdriver.common.by import By
3import pandas as pd
4driver = webdriver.Chrome()
5driver.get("https://example.com/products")
6data = []
7products = driver.find_elements(By.CLASS_NAME, "product-card")
8for p in products:
9 title = p.find_element(By.CLASS_NAME, "title").text
10 price = p.find_element(By.CLASS_NAME, "price").text
11 data.append([title, price])
12driver.quit()
13df = pd.DataFrame(data, columns=["タイトル", "価格"])
14df.to_csv("products.csv", index=False)
Selenium と BeautifulSoup / Scrapy の違いとは?
ここでよくある議論に決着をつけましょう。Selenium を使うべき場面と、BeautifulSoup や Scrapy のほうが向いている場面はどこなのでしょうか? 簡単に比較してみます。
| ツール | 最適な用途 | JavaScript 対応 | 速度・リソース使用量 |
|---|---|---|---|
| Selenium | 動的・インタラクティブなサイト | はい | やや遅く、メモリを多く使う |
| BeautifulSoup | 単純な静的 HTML のスクレイピング | いいえ | 非常に高速で軽量 |
| Scrapy | 大量の静的サイトのクロール | 限定的* | 超高速、非同期、RAM 消費が少ない |
| Thunderbit | ノーコードの業務向けスクレイピング | はい(AI) | 小規模〜中規模の作業に高速 |
* Scrapy はプラグインを使えば一部の動的コンテンツに対応できますが、得意分野ではありません()。
Selenium を使うべき場面:
- データがクリック、スクロール、ログイン後にしか表示されない
- ポップアップ、無限スクロール、動的なダッシュボードを操作する必要がある
- 静的スクレイパーでは対応しきれない
BeautifulSoup / Scrapy を使うべき場面:
- データが最初の HTML に含まれている
- 数千ページを高速にスクレイピングしたい
- リソース消費をできるだけ抑えたい
そして、もしコードを書かずに済ませたいなら、 を使えば AI で動的サイトをスクレイピングできます。あとは「AI Suggest Fields」をクリックして、Sheets、Notion、Airtable にエクスポートするだけです。(このあと詳しく紹介します。)
Selenium と Python でウェブスクレイピングを自動化する
正直なところ、スクレイピングスクリプトを動かすために朝 2 時に起きたい人なんていません。朗報は、Python のスケジューリングツールや、Linux/Mac の cron、Windows の Task Scheduler といった OS のスケジューラを使って、Selenium の処理を自動化できることです。
schedule ライブラリを使う
1import schedule
2import time
3def job():
4 # ここにスクレイピングコードを書く
5 print("スクレイピング中...")
6schedule.every().day.at("09:00").do(job)
7while True:
8 schedule.run_pending()
9 time.sleep(1)
cron を使う場合(Linux/Mac)
1 時間ごとに実行したいなら、crontab に次を追加します。
10 * * * * python /path/to/your_script.py
自動化のヒント:
- GUI のポップアップを避けるため、Selenium はヘッドレスモードで実行します(下記参照)。
- エラーを記録し、何か問題が起きたら自分に通知を送るようにします。
- リソースを解放するため、最後は必ず
driver.quit()でブラウザを閉じます。
効率を上げる: より速く、より安定した Selenium スクレイピングのコツ
Selenium は強力ですが、注意しないと遅くなったり、リソースを大量に消費したりします。ここでは、速度を上げてよくある悩みを避ける方法を紹介します。
1. ヘッドレスモードで実行する
Chrome が何十回も開いたり閉じたりするのを見ている必要はありません。ヘッドレスモードならブラウザは裏で動きます。
1from selenium.webdriver.chrome.options import Options
2opts = Options()
3opts.headless = True
4driver = webdriver.Chrome(options=opts)
2. 画像や不要なコンテンツをブロックする
テキストだけをスクレイピングするなら、画像を読み込む必要はありません。ブロックすればページの読み込みが速くなります。
1prefs = {"profile.managed_default_content_settings.images": 2}
2opts.add_experimental_option("prefs", prefs)
3. 効率的な locator を使う
- 複雑な XPath よりも、ID やシンプルな CSS セレクターを優先する
time.sleep()はできるだけ避け、代わりに明示的な待機(WebDriverWait)を使う
4. 待機時間をランダム化する
人間のブラウジングに近づけてブロックされにくくするため、ランダムな待ち時間を入れます。
1import random, time
2time.sleep(random.uniform(1, 3))
5. User-Agent と IP をローテーションする(必要なら)
大量にスクレイピングする場合は、User-Agent 文字列を切り替え、簡単な bot 対策を避けるためにプロキシの利用も検討してください。
6. セッションとエラーを管理する
try/exceptで要素がない場合も落ちずに処理する- エラーをログに残し、デバッグ用にスクリーンショットを保存する
さらに最適化のヒントが欲しいなら、 も参考になります。
応用編: Selenium と Thunderbit を組み合わせて構造化データを出力する
ここからが本当に面白いところです。特に、データ整理や出力の手間を減らしたいならなおさらです。
Selenium で生データを取得したあと、 を使えば次のことができます。
- フィールドを自動検出: Thunderbit の AI が、スクレイピングしたページや CSV を読み取り、列名を提案します(「AI Suggest Fields」)。
- サブページのスクレイピング: 商品ページのように URL の一覧がある場合、Thunderbit が各ページを巡回して、表に追加情報を補完できます。追加のコードは不要です。
- データの強化: その場で翻訳、分類、分析ができます。
- どこへでも出力: Google Sheets、Airtable、Notion、CSV、Excel にワンクリックでエクスポートできます。
ワークフロー例:
- Selenium で商品 URL とタイトルの一覧をスクレイピングする。
- データを CSV に出力する。
- Thunderbit を開き、CSV を取り込んで AI にフィールドを提案させる。
- Thunderbit のサブページスクレイピングで、各商品 URL から画像や仕様などの詳細を取得する。
- 最終的に構造化されたデータセットを Sheets や Notion に出力する。
この組み合わせなら、面倒な手作業の整理に何時間も費やさずに済みますし、ぐちゃぐちゃなデータの整形ではなく分析に集中できます。このワークフローについてさらに知りたい方は、 をご覧ください。
Selenium ウェブスクレイピングのベストプラクティスとトラブルシューティング
ウェブスクレイピングは釣りに少し似ています。大物が釣れることもあれば、藻に引っかかることもあります。ここでは、スクリプトを安定させ、かつ倫理的に使うためのポイントを紹介します。
ベストプラクティス
- robots.txt とサイト規約を尊重する: スクレイピングが許可されているか必ず確認する
- リクエストを制限する: サーバーに負荷をかけすぎないように、待機時間を入れ、HTTP 429 エラーに注意する
- 利用可能なら API を使う: データが API で公開されているなら、そちらを使うほうが安全で安定している
- 公開データだけを取得する: 個人情報や機微な情報は避け、プライバシー法にも注意する
- ポップアップと CAPTCHA に対応する: Selenium でポップアップを閉じることはできますが、CAPTCHA は自動化がかなり難しいので慎重に
- User-Agent と待機時間をランダム化する: 検知やブロックを避けやすくなる
よくあるエラーと対処法
| エラー | 意味 | 対処法 |
|---|---|---|
NoSuchElementException | 要素が見つからない | locator を再確認し、待機を使う |
| タイムアウトエラー | ページまたは要素の表示に時間がかかりすぎた | 待機時間を延ばす。通信速度も確認する |
| ドライバーとブラウザの不一致 | Selenium がブラウザを起動できない | ドライバーとブラウザのバージョンを更新する |
| セッションのクラッシュ | ブラウザが予期せず閉じた | ヘッドレスモードを使い、リソースを管理する |
さらに詳しいトラブルシューティングのヒントは、 も参考にしてください。
まとめと重要ポイント
動的ウェブスクレイピングは、もはや上級開発者だけのものではありません。Python と Selenium があれば、どんなブラウザでも自動操作でき、JavaScript だらけの難しいサイトともやり取りしながら、営業、リサーチ、あるいは純粋な興味のために必要なデータを取り出せます。覚えておきたいポイントは次のとおりです。
- Selenium は、動的でインタラクティブなサイトに最適なツールです。
- 重要な 3 ステップ は、セットアップ、要素の特定、抽出と保存です。
- スクリプトは自動化 して、定期的にデータを更新しましょう。
- ヘッドレスモード、適切な待機、効率的な locator を使って、速度と信頼性を高めましょう。
- Selenium と Thunderbit を組み合わせる と、データの構造化と出力が簡単になります。特に、スプレッドシート周りの面倒を避けたいならおすすめです。
自分で試してみる準備はできましたか? まずは上のコード例から始めてみてください。そして、スクレイピングを次の段階に進めたくなったら、 を試して、AI による即時のデータ整理と出力を体験してみましょう。さらに学びたい方は、 で深掘り記事、チュートリアル、最新のウェブ自動化情報をチェックしてください。
楽しくスクレイピングしましょう。そして、あなたのセレクターがいつも探しているものを見つけられますように。
FAQ
1. ウェブスクレイピングに BeautifulSoup や Scrapy ではなく Selenium を使うべきなのはなぜですか?
Selenium は、ユーザー操作や JavaScript 実行のあとにコンテンツが読み込まれる動的サイトのスクレイピングに最適です。BeautifulSoup と Scrapy は静的 HTML には高速ですが、動的要素の操作やクリック、スクロールの再現はできません。
2. Selenium のスクレイパーをもっと速く動かすにはどうすればいいですか?
ヘッドレスモードを使い、画像や不要なリソースをブロックし、効率的な locator を使い、人間のブラウジングを模したランダムな待機時間を追加してください。さらに詳しいヒントは をご覧ください。
3. Selenium のスクレイピング処理を自動実行するようにスケジュールできますか?
はい。Python の schedule ライブラリ、または OS のスケジューラ(cron や Task Scheduler)を使って、決まった間隔でスクリプトを実行できます。スクレイピングを自動化すると、データを常に最新に保ちやすくなります。
4. Selenium で取得したデータを出力する最善の方法は何ですか?
Pandas を使って CSV か Excel に保存するのがおすすめです。さらに高度な出力(Google Sheets、Notion、Airtable など)を行いたい場合は、データを に取り込み、ワンクリック出力機能を使ってください。
5. Selenium でポップアップや CAPTCHA はどう扱えばいいですか?
ポップアップは、要素を見つけて閉じるボタンをクリックすれば対応できます。CAPTCHA はずっと難しいため、遭遇した場合は手動の回避策や CAPTCHA 解決サービスの利用を検討し、常にサイトの利用規約を守ってください。
スクレイピングのチュートリアル、AI 自動化のヒント、ビジネスデータツールの最新情報をもっと見たいですか? を購読するか、 で実践デモをご覧ください。
さらに詳しく