Requestが「読み込み中...」に直面した時の絶望

第三章では、requests + BeautifulSoupを使った簡単なウェブスクレイピングを教えました。 この方法は10年前の古いウェブサイトには非常に有効です。しかし、現代のPChome、Shopee、または株価リアルタイム表示サイトをクロールしようとすると、ある衝撃的な事実に気づくでしょう:

取得したHTMLにはデータが何もなく、ただ一行の<div id="loading">読み込み中...</div>しか含まれていないのです。

これは、現代のウェブサイトがReactやVueで書かれた「動的レンダリング(CSR)」ページであるためです。データはブラウザがJavaScriptを実行した後、バックグラウンドAPIから密かに取得されます。さらに悪いことに、多くのサイトではCloudflareの「ボット検証(人間であることを確認するチェックボックス)」が追加されています。

このような場合、従来のクローラーは無力です。私たちには強力な武器が必要です:Playwright


🎭 Playwrightとは?

PlaywrightはMicrosoftがオープンソース化した最強の「ブラウザ自動化テストツール」です。 これを「幽霊エンジニア」と想像してください。PlaywrightのPythonスクリプトを実行すると、バックグラウンドで実際のChromeブラウザが開き、人間のようにボタンをクリックし、スクロールし、画面の読み込みが完了するのを待ち、最後に画面上のテキストを取得します。

実際のブラウザを使用するため、すべての動的レンダリングデータを完璧に取得でき、多くの初歩的なクローリング対策も回避できます。


🛠️ Vibe Coding実践:Playwrightで動的株価データを取得

Playwrightの構文を学ぶのは非常に困難です。なぜなら、非同期処理(async/await)とDOM要素の特定(XPath / CSSセレクター)が大量に含まれるからです。 しかし、Cursorがあれば、構文を覚える必要はありません。

【Playwright動的クローリングVibe Prompt】 Pythonでウェブクローラーを開発しています。 ターゲットサイトはhttps://example-stock-site.com/(3秒待つと動的にテーブルが読み込まれる株価サイトと仮定)。

playwrightパッケージを使用して以下の機能を実装してください:

  1. async/await構造を使用
  2. Chromiumブラウザを起動(操作過程を確認できるようheadless=Falseに設定)
  3. ターゲットURLに移動後、#stock-table要素が表示されるまで待機(動的データが読み込まれたことを確認)
  4. テーブル内のすべての.stock-price要素を取得し、価格を浮動小数点数に変換してPythonリストに保存
  5. 取得した価格リストをprices.csvとして保存
  6. 完全な日本語コメントとエラーハンドリングを追加

AIが生成した神スクリプト:

import asyncio
import csv
from playwright.async_api import async_playwright

async def scrape_dynamic_stocks():
    # Playwrightを起動
    async with async_playwright() as p:
        # ブラウザを起動、headless=Falseで実際のウィンドウを表示
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        
        try:
            print("🌐 株価サイトにアクセス中...")
            await page.goto('https://example-stock-site.com/')
            
            # 最も重要なステップ:動的テーブルの読み込み完了を待機!(空データ取得を防ぐ)
            print("⏳ データ読み込み待機中...")
            await page.wait_for_selector('#stock-table', timeout=10000)
            
            # classがstock-priceの全要素を取得
            price_elements = await page.query_selector_all('.stock-price')
            
            prices = []
            for element in price_elements:
                text = await element.inner_text()
                # 通貨記号とカンマを削除し、数値に変換
                clean_price = float(text.replace('$', '').replace(',', ''))
                prices.append([clean_price])
                
            # CSVに保存
            with open('prices.csv', 'w', newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow(['Price'])
                writer.writerows(prices)
                
            print(f"✅ {len(prices)}件の株価データ取得に成功!")
            
        except Exception as e:
            print(f"🚨 クローリングエラー:{e}")
        finally:
            await browser.close()

# 非同期プログラムを実行
asyncio.run(scrape_dynamic_stocks())

👁️ AIビジョンによる特定:クローリングの究極進化

これまで、クローリングエンジニアにとって最も苦痛だったのは、ウェブサイトのリニューアルでした。 相手のサイトエンジニアがclass="stock-price"class="price-text-v2"に変更するだけで、あなたのクローラーは即座にクラッシュしました。

しかし将来、Vibe CodingとAIの融合により、この問題は根本的に解決されます。 OpenAIのgpt-4o(視覚分析能力を備えた)をPlaywrightに接続すると、次のようなフローが実現します:

  1. Playwrightがウェブページを開く
  2. Playwrightがページ全体の「スクリーンショット」を取得
  3. Pythonスクリプトがこの画像をOpenAIに送信し質問:「この画像の中のTSMCの株価はいくつですか?
  4. OpenAIが直接画像を解析し、1050と返答

これは「セレクターレスクローリング(Selector-less Scraping)」と呼ばれます。 HTMLの構造やclass名の変更を全く気にする必要がありません。「人間の目で見える数字」さえあれば、AIが取得してくれます。これは現在データサイエンス分野で最先端の黒魔術であり、将来の受注作業における究極の武器となるでしょう!

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!