← CLAUDE-PENGIN-TOOLS
DOCUMENT · 4.6 KB

tools/robots-sitemap-checker/README.md

Workspace snapshot · 09/04 13:33

robots.txt / sitemap Consistency Checker

sitemapに載せているURLを、自分のrobots.txtが塞いでいないかを1コマンドで確認するCLIです。

無料のindexability checkerは「このURLはインデックスできるか」を1本ずつ見ます。 このツールが見るのはサイト内の矛盾です。robots.txt と sitemap が別々に正しくても、 組み合わせると噛み合っていないことがあります。それが最も気づきにくい取りこぼしです。

いちばん拾いたいケース

robots.txt:  Disallow: /private/
sitemap.xml: https://example.com/private/b   ← 自分でクロールを禁じたURLを、自分で申告している

これは Search Console で「robots.txt によりブロックされましたが、インデックスに登録しました」 などの警告として後から出てきます。公開直前に自分で気づけると手戻りがありません。

使い方

python robots_sitemap_check.py https://example.com
python robots_sitemap_check.py https://example.com --output report.json
python robots_sitemap_check.py https://example.com --sitemap https://example.com/news-sitemap.xml

robots.txt の Sitemap: 行を読み、sitemapindex なら子sitemapまで辿ります(深さ2まで)。 宣言が無い場合は /sitemap.xml を試します。

終了コードは、ERRORが1件でもあれば 1、それ以外は 0。CIやリリース前チェックに挟めます。

出力例:

{
  "site": "https://example.com",
  "robots_status": 200,
  "declared_sitemaps": ["https://example.com/sitemap.xml"],
  "sitemap_urls_checked": 2,
  "blocked_sitemap_urls": ["https://example.com/private/b"],
  "findings": [
    {
      "severity": "ERROR",
      "code": "sitemap_url_blocked_by_robots",
      "message": "1 sitemap URL(s) are disallowed by robots.txt, e.g. https://example.com/private/b"
    }
  ],
  "errors": 1,
  "warnings": 0,
  "ok": false
}

判定項目

code重大度内容
sitemap_url_blocked_by_robotsERRORsitemapのURLをrobots.txtが禁止している(本命)
root_disallowedERRORDisallow: / でサイト全体を塞いでいる
sitemap_unreachableERROR宣言したsitemapが200を返さない
sitemap_invalidERRORsitemapがXMLでない(HTMLのエラーページが返っている等)
sitemap_url_foreign_hostERRORsitemapに別ホストのURLが入っている
x_robots_noindexERRORサイトルートが X-Robots-Tag: noindex を返している
robots_unreachableERRORrobots.txtが読めない(タイムアウト、5xx等)
no_sitemap_directiveWARNrobots.txtに Sitemap: 行が無い
sitemap_empty / no_urls_foundWARNsitemapに <loc> が無い
sitemap_url_scheme_mismatchWARNsitemapのURLがhttp、サイトはhttps(またはその逆)
robots_missingINFOrobots.txtが無い(クロールは許可されるが、sitemap未申告)

できないこと

  • ページが実際にインデックスされているかは分かりません。 見るのは内部の整合性だけです。
  • 個々のページの <meta name="robots"> は見ません(HTMLを全件取得しないため)。 ルートの X-Robots-Tag ヘッダーだけ確認します。
  • クローラーごとの細かいルール差は見ません。判定は User-agent: * 基準です。
  • sitemapのURLが200を返すかは確認しません(大量リクエストを避けるため)。 リンク到達性は別ツールの担当です。

必要な環境

Python 3.10以上。外部パッケージ不要(標準ライブラリのみ)。 robots.txtの解釈は標準ライブラリの urllib.robotparser を使います。

テスト

python -m unittest discover -s tests

ネットワークへ出ずに判定ロジックだけを検証します。 analyze() は取得済みのドキュメントを引数で受け取る純粋関数なので、実サイトを叩きません。

検証状況

  • 判定ロジックのオフラインテスト: 同梱済み。ただしこのworkspaceでは実行していません (実行環境にシェルが無いため)。実行結果を伴わない「テスト済み」表示はしません。
  • 実サイトに対するスモークテスト: 未実施

License

MIT. 自分が所有または管理を委任されたサイトにのみ使用してください。

Part of PENGIN Tools — Web制作の面倒な作業を、小さな道具でなくす。