導入
requests で取った HTML に、ブラウザで見えるはずのデータが入っていないことがあります。JavaScript が後からデータを描画する「動的サイト」です。その対処法と、そもそもの近道を紹介します。
説明
なぜ空なのか:requests は HTML を受け取るだけで、JavaScript を実行しません。近年のサイトは、最初の HTML はほぼ空で、JS が API からデータを取ってきて表示することが多くあります。この場合、soup を見ても目的のデータは見つかりません。
対処法は主に2つです。
① ブラウザを自動操作する(Selenium / Playwright) 本物のブラウザをプログラムから動かし、JS の実行後の HTML を取得します。
# 概念コード(Playwright の例)
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com/dynamic")
html = page.content() # JS実行後のHTML
browser.close()
# あとは html を BeautifulSoup に渡せば、解析は同じ
② 裏側のAPIを直接使う(多くの場合こちらが最善)
JS が呼んでいる API は、ブラウザの開発者ツールの Network タブ で見つけられます。多くは JSON を返すので、requests で叩いて res.json() するだけで、HTML解析すら不要になります。
import requests
data = requests.get("https://example.com/api/items").json()
for item in data["items"]:
print(item["name"], item["price"])
flowchart TD
A{requestsで<br/>データが取れる?} -->|取れる| B[BeautifulSoupで解析<br/>第2〜4章の通り]
A -->|空っぽ| C{裏にAPIがある?<br/>Networkタブで確認}
C -->|ある| D[APIをrequestsで叩く<br/>JSONで楽に取れる]
C -->|ない| E[Selenium/Playwrightで<br/>ブラウザ自動操作]
やってみよう
動的サイトに当たったら、いきなり Selenium に飛びつく前に、開発者ツールの Network タブで「JSON を返す API」が無いか探しましょう。API が見つかれば、それを使うのが最も速く・軽く・安定します。
これでスクレイピングコースは修了です。**「requestsで取得 → BeautifulSoupで解析 → 整形して保存」**という一連の流れと、その裏で守るべきマナーを身につけました。あとは実際のサイト(まずは自分のブログや、スクレイピング練習用に公開されているサイト)で、少しずつ手を動かしてみてください。