SSL 証明書エラー

🔴 症状

requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]

社内システムや開発環境など、自己署名証明書を使っているサイトへの接続時に発生。

Python — SSL 検証を無効化(開発環境限定)
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

response = requests.get(url, verify=False, timeout=10)  # 本番では使わない

⚠️ verify=False は社内環境・開発専用

公開サイトで verify=False を使うと中間者攻撃のリスクが生じる。本番環境では CA 証明書バンドルを正しく設定すること。

文字化け

🔴 症状

label や placeholder に文字化けが含まれる。特に Shift_JIS や EUC-JP を使う古いサイトで頻発。

Python — 文字化け対処
# 方法 1: response.content(bytes)を BS に直接渡す
soup = BeautifulSoup(response.content, "lxml")

# 方法 2: apparent_encoding を使う(chardet が必要)
pip install chardet
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, "lxml")

# 方法 3: 明示的にエンコーディング指定
soup = BeautifulSoup(response.content.decode("shift_jis", errors="replace"), "lxml")

INPUT が 0 件(JS 未描画)

🔴 症状

extract_static() で INPUT が 0 件返ってくる。ブラウザで開くと INPUT は表示されている。

原因:JavaScript でフォームが動的に生成されているため、requests が取得した HTML には INPUT タグが存在しない。

対処extract_dynamic()(Playwright)に切り替える。

Python — 切り替え確認手順
from extractor import extract_inputs

# まず静的で試す
entities = extract_inputs(url)
if len(entities) == 0:
    print("静的で 0 件 → Playwright に切り替え")
    entities = extract_inputs(url, dynamic=True)

タイムアウト

🔴 症状

requests.exceptions.Timeout / playwright._impl._errors.TimeoutError

Python — タイムアウト調整
# requests: timeout 秒数を増やす
entities = extract_static(url, timeout=30)

# Playwright: ミリ秒で指定、networkidle でなく load に変える
entities = extract_dynamic(url, wait_until="load", timeout=60000)

Playwright 起動エラー(Linux 依存不足)

🔴 症状

Error: Failed to launch chromium because executable doesn't exist または libnss3.so: cannot open shared object file

Linux サーバーや Docker 環境で頻発。

Shell — 依存ライブラリのインストール
# 依存ライブラリを一括インストール(sudo 権限が必要)
sudo playwright install-deps chromium

# それでも起動しない場合はブラウザ自体を再インストール
playwright install chromium

403 / アクセス拒否

🔴 症状

requests.exceptions.HTTPError: 403 Client Error

Bot 対策として User-Agent を確認し、Python/requests を弾いているサイトで発生。

Python — ヘッダーを設定して回避
headers = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/124.0.0.0 Safari/537.36"
    )
}
response = requests.get(url, headers=headers, timeout=10)

⚠️ 利用規約の確認を忘れずに

スクレイピングを禁止しているサイトへの実行はサービス利用規約違反になる場合がある。必ず対象サイトの robots.txt と利用規約を確認してから実行すること。

次の章では…

PART 10 ではシリーズ全体のまとめとして、静的・動的の使い分け早見表と次のステップを解説します。

→ PART 10 — まとめへ