昨日まで取れていた一覧が急に少なくなったとき、まずセレクタを広げると、メニューなど目的外の要素まで拾うことがあります。取得件数の減少を見つけたら、どの段階で数が変わったかを確認します。
生の取得件数と、同じキーをまとめた件数を分けて比べます。重複の増加や途中終了は、単純な合計件数だけでは見えにくいためです。
最初に通信とページを確認する
HTTPステータス、最終URL、Content-Type、取得時刻を見ます。HTTP 200でも、目的の一覧ではなくログイン画面や案内ページが返っている場合があります。既知の見出しや一覧の囲みが存在するかも確認します。
複数ページを巡回する処理なら、どこまで取得したかを見ます。次ページリンクが見つからず終わったのか、HTTPエラーで途中までなのかでは、件数の意味が違います。途中結果を前回の完全な結果と同じ条件で比較しないようにします。
抽出と保存のどちらで減ったか
取得したHTMLの中に目的の要素があるかを見てから、セレクタの一致数を確認します。画面上にはあってもJavaScriptの描画後だけに存在する場合は、受け取ったHTMLを変えずにセレクタだけ直しても解決しません。
抽出時には取れていて、保存したCSVだけ少ないなら、除外条件、空欄チェック、重複処理、書き込み途中の失敗を調べます。どの段階の件数かをログで分けておくと、調査する範囲を絞れます。
件数と重複を比べる小さな例
次は架空のキーだけを使うPython例です。前回は五件、今回は三行ですが、同じBが二度出ています。ネットワーク通信やファイル変更はしません。
previous_ids = ["A", "B", "C", "D", "E"]
current_ids = ["A", "B", "B"]
if any(not isinstance(x, str) or not x.strip() for x in previous_ids + current_ids):
raise ValueError("空か不正なキーがあります")
previous = set(previous_ids)
current = set(current_ids)
duplicates = len(current_ids) - len(current)
ratio = len(current) / len(previous) if previous else None
needs_review = not current or duplicates > 0 or ratio is None or ratio < 0.5
print("今回の行数:", len(current_ids))
print("前回/今回の一意件数:", len(previous), len(current))
print("重複行数:", duplicates)
print("件数比:", ratio)
print("判定:", "要確認" if needs_review else "件数条件内")
出力は、今回の行数3、一意件数5と2、重複行数1、件数比0.4、判定は要確認です。0.5はこの架空例の条件で、一般に半分まで減ってよいという基準ではありません。
通常の変動と異常を分ける
曜日や公開終了によって件数が変わる対象なら、前回一回だけの値では判断できないことがあります。過去の正常な記録と、取得対象の条件を見て、どれくらいの変動を確認対象にするか決めます。
件数が条件内でも、中身が全て別のデータなら正常とは限りません。必須列、主な見出し、キーの重なり、抽出した数件の内容も照合します。件数の確認は品質確認の一部です。
原因が分かるまで基準を更新しない
急減した結果で前回データを上書きすると、次回比較の基準も減ってしまいます。今回分を確認用として残し、正常と判断できるまでは前回の基準を保持する設計にできます。
調査後は、サイトの構造変更、取得条件の変更、元データの正常な減少など、判断した理由を残します。セレクタを変えた場合には、件数が戻ったことに加え、目的のデータを取れているかも確認してから定期処理へ戻します。
関連する作業
欠損の検査項目と、セレクタの見直し方は次の記事でも確認できます。
