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パッケージを使用して以下の機能を実装してください:
async/await構造を使用- Chromiumブラウザを起動(操作過程を確認できるよう
headless=Falseに設定)- ターゲットURLに移動後、
#stock-table要素が表示されるまで待機(動的データが読み込まれたことを確認)- テーブル内のすべての
.stock-price要素を取得し、価格を浮動小数点数に変換してPythonリストに保存- 取得した価格リストを
prices.csvとして保存- 完全な日本語コメントとエラーハンドリングを追加
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に接続すると、次のようなフローが実現します:
- Playwrightがウェブページを開く
- Playwrightがページ全体の「スクリーンショット」を取得
- Pythonスクリプトがこの画像をOpenAIに送信し質問:「
この画像の中のTSMCの株価はいくつですか?」 - OpenAIが直接画像を解析し、
1050と返答
これは「セレクターレスクローリング(Selector-less Scraping)」と呼ばれます。 HTMLの構造やclass名の変更を全く気にする必要がありません。「人間の目で見える数字」さえあれば、AIが取得してくれます。これは現在データサイエンス分野で最先端の黒魔術であり、将来の受注作業における究極の武器となるでしょう!