概要
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()
コードの解説
- ブラウザの起動とページの設定
chromium.launch()
でChromiumをヘッドレスもしくはヘッドフルで起動します。page.goto(url)
で目的のURLにアクセスします。
- ページタイトルの収集
page.title()
でページのタイトルを取得します。
- 主要要素の収集
locator("h1")
で要素を特定し、inner_text()
で内部テキストを収集します。
- エレメントリンクの収集
locator("a").all()
ですべてのリンクを収集します。get_attribute("href")
でリンクからリンク元を取得します。- リンクはデコード化して表示されます。
- 画像のダウンロード
locator("img").all()
ですべての画像要素を収集します。- 個別の画像URLに移動してスクリーンショットを撮影、元のページに戻ります。
複雑なタグ指定の例
Playwrightのpage.locator()
は柔軟で、複雑なセレクタを利用することで様々な要素を特定できます。
以下にいくつかのパターンを紹介します。
- CSSセレクタを利用した複雑な指定
page.locator("div.class-name > ul > li:nth-child(2)")
: 特定の階層構造にある要素を指定。
- 属性値を用いたフィルタリング
page.locator("input[type='text'][name='username']")
: 属性と値で絞り込む。
- 部分一致による柔軟なマッチング
page.locator("a[href*='contact']")
:href
属性に特定の文字列を含む要素を取得。
- 正規表現を使用
page.locator("text=/\bExample\b/i")
: テキストが「Example」に一致する要素を特定(大小文字を区別しない)。
- 複数条件の組み合わせ
page.locator("div[class~='container'][id^='main']")
: 複数条件で絞り込み。
記事の結論
このコードでは、Playwrightを使った実践的なスクレイピングの流れを解説しました。
いかがでしょうか、割と簡単なんだなと思っていただけたでしょうか。
それに明らかにSeleniumより動作が機敏ですね。
これからいくつか違ったパターンのスクレイピングを解説する予定です。
Commnts