Playwright実践編:シンプルなサイト

プログラミング

概要

Playwrightで実際にスクレイピングを行ってみます。
難しくない素直にスクレイピングできる例で説明します。


シナリオ

下記のページをスクレイプして画像やテキストを取得します。

  • URL: https://goro-bizaid.com
  • 収集情報
    • ページのタイトル
    • 主要要素のテキスト
    • エレメントのリスト
    • 画像のダウンロード

コードの概要

下記は実際に実行できるPlaywrightコードです。

コンソールに、ページタイトルとタイトルとリンク先URLを取得して表示します。
画像をすべて取得して保存します。

from playwright.sync_api import sync_playwright
import os
import urllib.parse

def scrape_example():
    with sync_playwright() as p:
        # ブラウザの起動
        browser = p.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()

        # 目的のページにアクセス
        url = "https://goro-bizaid.com"
        page.goto(url)

        # ページタイトルを収集
        title = page.title()
        print(f"Page Title: {title}")

        # 主要要素のテキストを収集
        main_text = page.locator("h1").inner_text()
        print(f"Main Text: {main_text}")

        # エレメントのリストを収集
        links = page.locator("a").all()
        for link in links:
            href = link.get_attribute("href")
            if href:
                #urlでコードして読めるようにする
                decoded_href = urllib.parse.unquote(href)
                print(f"Link: {decoded_href}")

        # 画像のダウンロード
        images = page.locator("img").all()
        os.makedirs("images", exist_ok=True)
        for index, img in enumerate(images):
            src = img.get_attribute("src")
            if src:
                decoded_src = urllib.parse.unquote(src)
                page.goto(decoded_src)
                page.screenshot(path=f"images/image_{index}.png")
                page.goto(url)  # 元のページに戻る

        # ブラウザの終了
        browser.close()

if __name__ == "__main__":
    scrape_example()

コードの解説

  1. ブラウザの起動とページの設定
    • chromium.launch() でChromiumをヘッドレスもしくはヘッドフルで起動します。
    • page.goto(url) で目的のURLにアクセスします。
  2. ページタイトルの収集
    • page.title() でページのタイトルを取得します。
  3. 主要要素の収集
    • locator("h1") で要素を特定し、inner_text() で内部テキストを収集します。
  4. エレメントリンクの収集
    • locator("a").all() ですべてのリンクを収集します。
    • get_attribute("href") でリンクからリンク元を取得します。
    • リンクはデコード化して表示されます。
  5. 画像のダウンロード
    • locator("img").all() ですべての画像要素を収集します。
    • 個別の画像URLに移動してスクリーンショットを撮影、元のページに戻ります。

複雑なタグ指定の例

Playwrightのpage.locator()は柔軟で、複雑なセレクタを利用することで様々な要素を特定できます。

以下にいくつかのパターンを紹介します。

  1. CSSセレクタを利用した複雑な指定
    • page.locator("div.class-name > ul > li:nth-child(2)"): 特定の階層構造にある要素を指定。
  2. 属性値を用いたフィルタリング
    • page.locator("input[type='text'][name='username']"): 属性と値で絞り込む。
  3. 部分一致による柔軟なマッチング
    • page.locator("a[href*='contact']"): href属性に特定の文字列を含む要素を取得。
  4. 正規表現を使用
    • page.locator("text=/\bExample\b/i"): テキストが「Example」に一致する要素を特定(大小文字を区別しない)。
  5. 複数条件の組み合わせ
    • page.locator("div[class~='container'][id^='main']"): 複数条件で絞り込み。

記事の結論

このコードでは、Playwrightを使った実践的なスクレイピングの流れを解説しました。

いかがでしょうか、割と簡単なんだなと思っていただけたでしょうか。
それに明らかにSeleniumより動作が機敏ですね。

これからいくつか違ったパターンのスクレイピングを解説する予定です。

Commnts