Seleniumはもう時代遅れ?スクレイピングはPlaywright一択!!

「リダイレクトの待ち時間を考慮してtime.sleep()を入れたのに、読み込みが遅れてエラーになった」

かと言って長めに待ち時間を設定すると、今度は処理全体のスピードが遅くなってイライラする…

Pythonでのスクレイピングにおいて、このような「Selenium」特有の調整に疲れ果ててはいませんか?

もしあなたが今でもSeleniumを使っているなら、それは非常にもったいないことです。結論から申し上げます。これからのPythonスクレイピングは「Playwright」一択です!!

本記事では、長年Seleniumの「待機処理地獄」や「WebDriver管理」に苦しんできた私が「Playwright」に乗り換えて開発効率が劇的に向上した理由と、その具体的な使い方を解説します。

実際に「Playwright」を使ってみて、私が最も感動したのは以下の点です。

  • リダイレクト完了を自動で認識するためtime.sleep()による無駄な待機時間がゼロになった。
  • 「codegen(コード生成機能)」を使えば、ブラウザを操作するだけで勝手にコードが完成する。
  • 面倒なWebDriverのインストールやパス通しが一切不要。

Seleniumは素晴らしいツールですが、現代のスクレイピングにおいては、もはや「時代遅れ」と言わざるを得ません。この記事を読み終えた頃には、あなたも間違いなくSeleniumを卒業し、Playwrightをインストールしたくなるはずです。

この記事でわかること
  • SeleniumユーザーがPlaywrightに乗り換えるべき3つの決定的な理由
  • 面倒な待機処理を撲滅する「Auto-wait」の仕組み
  • 操作するだけでコードが自動生成される「codegen」の衝撃的な便利さ
  • Playwrightの導入から基本的な使い方まで
目次

なぜ「Seleniumは時代遅れ」と言われるのか?3つの限界

長年、webスクレイピングのデファクトスタンダードとして君臨してきた「Selenium」ですが、近年のwebアプリの進化に伴い、Seleniumのアーキテクチャでは対応しきれない「構造的な限界」が露呈してきています。

多くのエンジニアが「Seleniumは辛い」と感じ、Playwrightへの移行を決意する主な理由は、以下の3つの限界にあると思います。

time.sleep()地獄:不安定な待機処理との戦い

Seleniumを使用する上で、最も開発者を悩ませるのが「待機処理の難しさ」です。

Seleniumは、webページの読み込みやリダイレクトが完了したことを正確に判断するのが苦手です。そのため、開発者はコードの至るところにtime.sleep()などの待機処理を手動で埋め込む必要があります。

具体的には、以下のようなジレンマに常に直面することになります。

  • 待ち時間が短い場合:リダイレクトや要素の描画が間に合わ「No such element exception(要素が見つからない)」というエラーで処理が止まってしまう。
  • 待ち時間を長くした場合:安全策を取って「5秒待機」と設定したとき、実際のリダイレクトが「1秒」で終わったとしても、残りの4秒間はただ待つだけの無駄な時間が発生する。

私自身、Seleniumで開発していた頃は、この「見えない待ち時間」との戦いに明け暮れていまし。リダイレクトのタイミングはネットワーク状況によって変わるため、昨日動いたコードが今日はエラーになる、という不安定さが常に付きまといます。この「不安定な待機処理」こそが、Seleniumは最大のボトルネックです。

WebDriver管理の手間:環境構築の煩わしさ

2つ目の限界は、ブラウザを操作するために必須となる「WebDriver」の管理コストです。

Seleniumを動かすためには、操作するGoogle Chromeのバージョンに一致する「Chrome Driver」をインストールし、パスを通す必要があります。しかし、Chromeは頻繁に自動アップデートされるため、ある日突然バージョン不一致のエラーが発生し、スクレイピングが動かなくなるという事故が多発します。

SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XX...

エラー画面を見て、絶望した経験がある方も多いのではないでしょうか。

近年では実行時に自動でドライバをインストールするライブラリも登場しましたが、それを使用しても毎回の実行時にインストール処理が走るため、スクレイピングの開始までに時間がかかるという新たな問題が発生します。

環境構築の手間と、維持管理のコスト。これらは開発の本質ではない「雑務」であり、開発者の時間を奪う大きな要因となっています。

開発スピードの鈍化:要素特定とコーディングの往復

3つ目の限界は、スクレイピングコードを作成する際の手順の多さです。

Seleniumでコードを書く場合、一般的には以下のフローを繰り返す必要があります。

  1. 操作したいブラウザを開き、デベロッパーツールを起動する。
  2. 対象のボタンや入力フォームの要素(HTML)を探す。
  3. その要素を一意に特定できる「XPath」や「CSSセレクタ」を考え、コピーする。
  4. エディタに戻りdriver.find_element(By.XPATH, "...")と記述する。

この「ブラウザで要素を調べて、エディタに書き写す」という反復作業は、非常に泥臭く、時間がかかります。また苦労して書いたXPATHが、サイトのデザイン変更で少し変わっただけで動かなくなることも日常茶飯事です。

スクレイピングの新王者「Playwright」が優れている3つの理由

Seleniumが抱える数々のストレスから、エンジニアを開放するために生まれたのが、Microsoft製のライブラリ「Playwright」です。

私がSeleniumからPlaywrightに乗り換えて、最も衝撃を受けたのは、単に「新しい」からではなく、Seleniumで苦労していた部分が、すべて解消されたからです。具体的に何が優れているのか、その決定的な3つの理由を解説します。

【Auto-wait】待機処理の自動化で無駄な時間がゼロに

Playwright最大の革命は「Auto-wait(自動待機)」という仕組みです。

これはコードで明示的に指示しなくても、Playwright側が「要素が表示されるまで」・「クリック可能になるまで」・「リダイレクトが完了するまで」といったアクションの完了を、自動的かつ賢く待ってくれる機能です。

Selenium時代は、リダイレクト処理の前にtime.sleep(3)といった待機コードを入れる必要がありました。しかし、Playwrightではその必要がありません。

なおくん

正直、この機能には感動しました。
リダイレクトにかかる時間を考慮しなくて良いなんて…!!

私が実際に開発を行っていて感じたのは、無駄な待ち時間が徹底的に削ぎ落とされているという点です。

  • リダイレクトが速い時:Playwrightは完了を即座に検知し、0.1秒も無駄にせず次の処理に進みます。
  • リダイレクトが遅い時:必要な分だけ待ち、完了次第すぐに動きます。

Seleniumで固定の待ち時間を設定していた頃は、すぐに終わる処理でも指定時間(例:5秒)待たされるという「無駄」が発生していましたが、Playwrightはそのロスを最小限に最適化してくれます。これにより、例外処理が激減し、スクリプトの安定性が飛躍的に向上しました。

【爆速環境構築】コマンド一発でセットアップ完了

2つ目の理由は、環境構築の手軽さです。

Seleniumでは、Chromeのバージョンに合わせたWebDriver(ChromeDriver)を手動でダウンロードし、パスを通す必要がありました。またブラウザが自動更新されるたびにドライバも更新しなければならないという「いたちごっこ」が発生していました。

しかし、Playwrightの環境構築は驚くほどシンプルです。以下の2つのコマンドを打つだけで完了します。

pip install playwright
playwright install

これだけで、Playwright専用にチューニングされたブラウザバイナリ(Chromium、Firefox、WebKit)が一括でインストールされます。

私自身、Seleniumを使っていた頃は、実行時にWebDriverを自動インストールするライブラリ(webdriver_manager)を使っていましたが、それでも毎回の実行時にインストール確認の通信が走り、起動までに数秒待たされるというストレスがありました。

Playwrightは、一度インストールすればその後の起動は爆速です。「コードを実行した瞬間にブラウザが立ち上がる」という当たり前の快適さが、ここにはあります。

【高速動作】実行速度と安定性の両立

3つ目の理由は、圧倒的な「実行速度」と「安定性」です。

もちろん、スクレイピングの速度は相手サーバーの応答速度に依存するため、通信部分だけで見ればSeleniumと大差ない場合もあります。しかし、スクリプト全体の処理時間で見ると、Playwrightの方が確実に速くなります。

その理由は、前述した2つの特徴の相乗効果です。

  1. 起動の速さ:WebDriverのインストール確認がないため、実行直後から処理が始まる。
  2. 待機の最適化:Auto-waitにより、無駄なアイドリングタイムが発生しない。

また、個人的に協調したいのは「エラー落ちの少なさ」です。Seleniumでは、リダイレクトのタイミングによって「要素が見つかりません」というエラーが頻発していましたが、PlaywrighはDOMの変化をより深く監視しているため、リダイレクト直後でも正確に要素を掴んでくれます。

「エラーで止まったから再実行しなきゃ…」という手戻りの時間がなくなることこそ、最大の「時短」といえるでしょう。

【実演】Playwrightの「コード生成機能(codegen)」に感動せよ

ここまでPlaywrighの性能面でのメリットをお伝えしましたが、私がSeleniumから乗り換えた最大の決定打は、この機能にあります。

それが「codegen(コード生成機能)」です。

なおくん

初めてこの機能を使った時、あまりの簡単さに「今までの苦労は何だったんだ…」と呆然としました。これは、スクレイピング開発の概念を覆す「魔法」です。

サイトを操作するだけ?魔法のような開発体験

Seleniumでスクレイピングコードを書くとき、私たちは「翻訳家」のような作業を強いられてきました。

  1. ブラウザでボタンを見つける。
  2. デベロッパーツールを開いて、そのボタンを表すHTMLタグ(XPATHやCSSセレクタ)を探し出す。
  3. それをPythonコードに書き写す。

この「サイト」と「コード」を行き来する地味な作業が、開発時間の8割を奪っていたと言っても過言ではありません。

しかし、Playwrightの「codegen」を使えば、この作業は一切不要になります。

あなたがやるべきことは「ただ、ブラウザを操作すること」だけです。Playwrightを録画モードで起動し、クリックや入力を行うと、その操作がリアルタイムでPythonコードとして自動生成されます。

これまでは、複雑な階層にある要素を指定するために、頭を抱えながらXPathを組み立てていました。しかし、Playwrightなら、あなたがクリックしたその場所を、AIのように賢いロケータが自動的に特定し、最も壊れにくいコードを生成してくれます。

実際の生成手順:3ステップでコードが完成

では、実際にどれほど簡単にコードが作れるのか、その手順を見てみましょう。たったの3ステップです。

ステップ1:ターミナルでコマンドを実行する

まず、スクレイピングしたいサイトのURLを指定して、以下のコマンドを実行します。ここでは例として、Pythonの公式サイトを指定します。

playwright codegen https://playwright.dev/python/

もし生成したコードぉ直接ファイルに保存したい場合は-oオプションを使います。(推奨)

# 操作内容を main.py というファイルに保存する場合
playwright codegen -o main.py https://playwright.dev/python/

ステップ2:ブラウザで操作を行う

コマンドを実行すると、以下の2つのウィンドウが立ち上がります。

  1. 操作用ブラウザ:あなたが操作するための画面。
  2. Playwright Inspector:生成されたコードがリアルタイムで表示される画面。

ここで、検索窓に文字を入力したり、ボタンをクリックしたりしてみてください。あなた動いたとおりに、Inspector画面にコードがどんどん追記されていきます。

ステップ3:コードをコピーして完了

操作が終わったら、Inspector画面のコードをコピー(また自動保存されたファイルを確認)するだけです。

生成されるコードは以下のような非常に読みやすく、モダンな書き方になっています。

from playwright.sync_api import Playwright, sync_playwright

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    
    # 指定したURLへアクセス
    page.goto("https://www.python.org/")
    
    # 検索窓をクリック(自動生成されたロケータ)
    page.get_by_placeholder("Search").click()
    
    # "playwright" と入力
    page.get_by_placeholder("Search").fill("playwright")
    
    # 検索実行(Enterキー)
    page.get_by_placeholder("Search").press("Enter")

    # ブラウザを閉じる
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

ご覧の通り、get_by_placeholder("Search")のように、人間が見て意味がわかるロケータが自動で選ばれています。Seleniumのように意味不明なdiv>span:nth-child(3)のようなセレクタを手書きする必要は、もう二度とありません。

PlaywrightとSeleniumの徹底比較表

ここまでの内容を踏まえ、SeleniumとPlaywrightの機能や特徴を比較表にまとめました。

どちらも素晴らしいライブラリですが「開発効率」と「実行の安定性」において、Playwrightが圧倒していることが一目でわかります。

スクロールできます
比較項目SeleniumPlaywright
待機処理手動
(time.sleepやExplicit Waitの記述が必須。調整がシビア)
完全自動 Auto-wait
(要素の表示やリダイレクトを自動検知・記述不要)
環境構築面倒
(ブラウザとWebDriverのバージョン一致管理が必要)
超簡単
(コマンド2つで専用ブラウザを一括インストール)
コード作成手動
(デベロッパーツールの検証機能とエディタを往復)
自動生成 codegen
(ブラウザ操作を録画するだけでコードが完成)
実行速度普通~遅い
(無駄な待機時間が発生しやすく、起動も重め)
高速
(最適化された待機処理と軽量な起動プロセス)
情報量・歴史非常に多い
(10年以上の歴史があり、日本語情報も豊富)
やや少ない
(新興ライブラリのため、Seleniumほど資産は多くない)

Playwrightの弱点と今後の展望

ここまでPlaywrightを絶賛してきましたが、フェアな比較のために、現時点でSeleniumに劣る点、すなわち「弱点」についても正直にお伝えします。

それは「歴史の浅さゆえの情報量とエコシステムの差」です。

Seleniumは長年使われてきたため、困ったときに検索すれば日本語の解決策が山のように出てきます。またSeleniumを拡張するサードパーティ製のライブラリやコミュニティも巨大です。

一方でPlaywrightは比較的新しいライブラリであるため、Seleniumに比べると日本語の情報はまだ少なめです。「学習コストがやや高い」と感じる場面があるかもしれません。また独自の関連ライブラリといったエコシステムも、Seleniumほどは成熟していません。

しかし、これは時間の問題で解決されるでしょう。

なおくん

公式ドキュメントが非常に充実しているため、慣れれば情報不足で困ることはほぼありません。何より、この圧倒的な利便性を知ったエンジニアたちが、今まさに猛スピードでPlaywrightに移行していると思います。

シェアの拡大とともに、情報量やコミュニティの差は急速に縮まっています。今から学ぶのであれば、将来性という観点でもPlaywrightに投資するのが賢明な判断です。

PythonでPlaywrightを始めるための全手順

それでは、実際にPythonでPlaywrightを動かしてみましょう。手順は非常にシンプルで、Seleniumのような複雑なドライバ設定は一切不要です。

2ステップで完了するインストール

STEP
ライブラリのインストール

まずpipを使って、Playwright本体をインストールします。

pip install playwright
STEP
ブラウザバイナリのインストール

次に以下のコマンドを実行します。これによりPlaywrightが制御するための専用ブラウザ(Chromium, Firefox, WebKit)が一括でインストールされます。

playwright install

たったこれだけで、環境構築は完了です。パスを通したり、バージョンを気にする必要はありません。

基本的なコードの書き方と「ロケータ」

インストールができたら、実際にスクレイピングを行うコードを書いてみましょう。ここでは、Googleで検索を行う簡単なサンプルコードを紹介します。

from playwright.sync_api import sync_playwright

def run():
    with sync_playwright() as p:
        # ブラウザを起動(headless=Falseで画面を表示)
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()

        # Googleにアクセス
        page.goto("https://www.google.com/")

        # 【ロケータ】検索ボックスを見つけて入力をする
        # ユーザーに見えている「ラベル」や「プレースホルダー」で指定可能
        page.get_by_label("検索").fill("Playwright Python")

        # Enterキーを押す(検索実行)
        page.keyboard.press("Enter")

        # 検索結果が表示されるのを自動で待機し、タイトルを取得
        # Auto-wait機能により、time.sleep()は不要!
        page.locator("#search").wait_for()
        print(page.title())

        # ブラウザを閉じる
        browser.close()

if __name__ == "__main__":
    run()

このコードの中で、ぜひ注目していただきたいのが「ロケータ」という概念です。

ロケータとは?

一言で言えば「要素を見つけるための、より賢くて壊れにくい検索方法」です。SeleniumではXpathCSS Selectorを使って「HTMLの構造」で指定していましたが、Playwrightのロケータは「ユーザーに見えている文字」や「ラベル」で要素を指定することを推奨しています。これにより、サイトのデザインが多少変わっても、コードが動かなくなるリスクを劇的に減らすことができます。

困っときの「トレースビューア」

最後に開発中にエラーが発生した際の強力な味方を紹介します。

トレースビューア

スクレイピングの実行過程を記録し、あとから「タイムマシンのように再生できるデバッグ機能」です。「どこかでクリックしたか」「その時画面はどうなっていたか」「ネットワーク通信は何が行われていたか」を、時系列で詳細に振り返ることができます。これを使えば、エラーの原因特定にかかる時間を大幅に短縮できます。

まとめ:今すぐSeleniumを捨てて、Playwrightへ移行しよう

本記事では、Seleniumの限界と、それを解決するPlaywrightの圧倒的なメリットについて解説しました。

改めて、Playwrightを導入すべき理由を整理します。

  • 待機処理からの解放:time.sleep()時刻にサヨナラ。Auto-waitが安定動作を保証します。
  • 開発速度の爆増:codegenを使えば、ブラウザを操作するだけでコードが完成します。
  • 環境構築の簡略化:コマンド2発で準備完了。WebDriverの管理コストはゼロです。

私自身、長年Seleniumを使ってきましたが、Playwrightに移行してからは、スクレイピングの実装にかかる時間が半分以下になりました。何より「いつエラーで止まるかわからない」というストレスから解放されたことが、最大のメリットだと感じています。

もしあなたが、今もSeleniumの調整に時間を費やしているのなら、それは非常にもったいないことです。

今すぐPlaywrightをインストールし、あの快適なcodegen機能を体験してみてください。もう二度と、Seleniumには戻れなくなるはずです。

目次