本文へスキップ
BecomeCoder

Pythonスクレイピングコース · 第5章 実務のスクレイピング · レッスン18

動的サイトとAPIという選択肢

ローカル実施

導入

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で解析 → 整形して保存」**という一連の流れと、その裏で守るべきマナーを身につけました。あとは実際のサイト(まずは自分のブログや、スクレイピング練習用に公開されているサイト)で、少しずつ手を動かしてみてください。