FessのWebクロールでrobots.txtと再取得の動作を改善する

FessのWebクロールで、robots.txtの判定、クロール間隔、過負荷時の再試行、変更のないページの再取得を見直しました。クロール先のルールを適切に扱い、再クロール時の無駄な転送も減らすための変更です。

robots.txtのルール判定

robots.txtをオリジン単位で解決し、AllowとDisallowの最長一致を使って判定します。同じ長さならAllowを優先します。以前のようにAllowをクロール全体のURL許可パターンへ変換する方式をやめ、開始URLにもルールを適用します。

HTTPクライアントとPlaywrightクライアントで共通の判定処理を使うようにしました。ルールで禁止されたURLはINFOログに残し、アクセス失敗URLには登録しません。

robots.txtを取得できない場合

404などの4xxは許可として扱いますが、429、5xx、タイムアウトなどの場合は待機と再試行を行います。標準では最初の失敗後に3回まで再試行し、それでも取得できなければ、そのクロール中は対象オリジンへのアクセスを停止します。

従来の「robots.txtを取得できなければ許可する」挙動から変わる点です。従来の扱いが必要なクロール設定では、パラメーター欄に以下を指定できます。

client.robotsTxtAllowOnUnavailable=true

これはrobots.txtのルールそのものを無効にする設定ではありません。取得失敗も障害として追えるように、後続の修正でアクセス例外を報告し、同じURLの重複報告を抑えています。ルールによる禁止と通信障害を区別して確認できます。

間隔とバックオフ

robots.txtのCrawl-delayをオリジンごとに適用します。小数の値にも対応し、標準の待機上限は60秒です。増分クロールで同じURLに対して行うHEADとGETの間隔を個別に空ける仕組みではなく、URL単位でペースを調整します。

429や503の応答ではRetry-Afterを使い、ない場合は指数的に待機時間を増やして再試行します。既存のクロール設定の間隔と組み合わせて利用できます。

条件付きGETで再転送を減らす

増分クロールでは従来のHEADとLast-Modifiedの比較を残し、それだけで変更を判断できない場合に、保存したETagや更新日時をGETの条件へ渡します。

If-None-Match: <保存済みのETag>
If-Modified-Since: <保存済みの更新日時>

304 Not Modifiedなら本文を再取得・再解析せず、保存済みアンカーを使って後続URLを処理し、有効期限を延長します。対象はHTTP・HTTPSで、ファイル、SMB、FTPやPlaywrightの条件付きGETには適用しません。

クロール設定変更後などに本文を必ず取り直したい場合は、増分クロールを無効にして再取得してください。アップグレード後は、取得できないrobots.txtが原因で停止していないかログを確認するとよいと思います。

関連PR

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です