UC-CRAWL-004CrawlLv3
コンプライアンス/アクセシビリティ監査
法令/ガイドライン対応状況を網羅的にクロールしてチェックする。
Crawl API
KPI 例
- 指摘件数
- 重大度別件数
- 再発率
コンプライアンスやアクセシビリティ監査では、監査担当が毎回目視で全ページを確認するのは現実的ではありません。Crawl API で対象ページ群を定期収集し、HTML と構造化データを保存しておくと、ポリシーページの有無や ARIA 関連要素の確認を半自動化しやすくなります。
誰の課題か
- プライバシーポリシー、利用規約、問い合わせ導線の公開状況を定期確認したい法務・監査担当
- 複数言語サイトのアクセシビリティ対応を継続確認したい品質管理チーム
- 外部監査に備えて、監査時点の公開ページ証跡を残したい組織
推奨製品セット
| 構成要素 | 役割 | このユースケースでの使い方 |
|---|---|---|
| Crawl API | 監査対象ページの収集 | HTML や構造化フィールドを取得する |
| API Access | 認証方式 | 定期監査ジョブから一貫した方式で呼ぶ |
| Webhook または外部ストレージ | 証跡保管 | 監査結果を後から参照しやすくする |
- Crawl API Overview では compliance and accessibility checks が代表ユースケースです。
- この用途では、判定そのものよりまず証跡収集を自動化することが重要です。
最小実装イメージ
1. 監査対象ページを HTML 付きで収集する
curl -X POST "https://api.brightdata.com/datasets/v3/trigger?dataset_id=$CRAWL_DATASET_ID&include_errors=true&custom_output_fields=page_html,ld_json" \
-H "Authorization: Bearer $BRIGHTDATA_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{"url":"https://example.com/"},
{"url":"https://example.com/privacy"},
{"url":"https://example.com/accessibility"}
]'- 監査では Markdown より、実際の DOM 確認に使える
page_htmlが役立ちます。 - JSON-LD の有無を見たい場合は
ld_jsonを同時に取得しておくと再解析しやすくなります。
2. HTML から簡単な監査観点を抽出する
import os
import time
import requests
from bs4 import BeautifulSoup
api_key = os.environ["BRIGHTDATA_API_KEY"]
dataset_id = os.environ["CRAWL_DATASET_ID"]
headers = {"Authorization": f"Bearer {api_key}"}
trigger = requests.post(
f"https://api.brightdata.com/datasets/v3/trigger?dataset_id={dataset_id}&include_errors=true&custom_output_fields=page_html,ld_json",
headers={**headers, "Content-Type": "application/json"},
json=[
{"url": "https://example.com/"},
{"url": "https://example.com/privacy"},
{"url": "https://example.com/accessibility"},
],
timeout=60,
)
trigger.raise_for_status()
snapshot_id = trigger.json()["snapshot_id"]
while True:
progress = requests.get(
f"https://api.brightdata.com/datasets/v3/progress/{snapshot_id}",
headers=headers,
timeout=60,
)
progress.raise_for_status()
status = progress.json()["status"]
if status == "ready":
break
if status == "failed":
raise RuntimeError(f"snapshot failed: {snapshot_id}")
time.sleep(10)
rows = requests.get(
f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json",
headers=headers,
timeout=120,
).json()
for row in rows:
soup = BeautifulSoup(row.get("page_html", ""), "html.parser")
has_privacy_link = bool(soup.find("a", href=lambda x: x and "privacy" in x.lower()))
aria_nodes = len(soup.select("[aria-label], [role], [alt]"))
print({
"url": row.get("url"),
"has_privacy_link": has_privacy_link,
"aria_related_nodes": aria_nodes,
"has_ld_json": bool(row.get("ld_json")),
})- ここでは公開ページの存在確認と DOM 上の簡易チェックだけに絞っています。
- WCAG 適合判定そのものは専用ツールや監査基準と組み合わせて行う前提です。
運用ポイント
- 監査バッチでは、何を「違反」とするかより先に、どのページを対象にし、どの証跡を残すかを固定する必要があります。
- 取得 HTML は監査時点の証跡になるため、実行日時、対象 URL、
snapshot_idをセットで残すと説明責任を果たしやすくなります。 - ポリシーやアクセシビリティ関連ページは多言語展開されることがあるため、対象 URL 一覧を言語別に管理すると運用しやすくなります。
- 定期監査は scheduler support や webhook delivery を前提にし、単発の手動確認から脱却するのが実務的です。