Skip to content

feat(crawler): アーカイブ更新機能(--update フラグ)の追加 #23

@YusukeHirao

Description

@YusukeHirao

概要

既存の .nitpicker アーカイブに対して、特定ページまたは全ページを再クロールして更新する機能を追加する。

現在は「クロール → アーカイブ保存 → 分析」の一方向フローのみで、サイトのコンテンツ変更を反映するには毎回ゼロからクロールし直す必要がある。この機能により、既存アーカイブを開いて再スクレイプし、最新のデータで上書きできるようになる。

背景・動機

  • 大規模サイトのクロールには時間がかかるため、変更があったページだけを効率的に更新したい
  • 定期監査のワークフローで、前回のアーカイブをベースに差分更新できると運用コストが大幅に下がる
  • --resume(中断再開)は既にあるが、「完了済みアーカイブの再クロール」は未対応

要件

CLI インターフェース

crawl コマンドに --update-U)フラグを追加する。--resume と同じパターンで、アーカイブファイルパスを引数に取る。

# 全ページ更新(再帰的に新ページも発見・追加)
nitpicker crawl --update <archive.nitpicker>

# 特定ページのみ更新(指定ページのみ再スクレイプ)
nitpicker crawl --update <archive.nitpicker> --urls https://example.com/page1 --urls https://example.com/page2

# クロールオプションの上書きも可能
nitpicker crawl --update <archive.nitpicker> --parallels 5 --interval 1000

モード1: 全ページ更新(--update のみ)

  • アーカイブに保存された baseUrl から再帰クロールをやり直す
  • 既存ページは最新のスクレイプ結果で上書きされる(upsert)
  • 新たに発見されたページはアーカイブに追加される
  • 到達不能になった既存ページはアーカイブに残るが、再スクレイプされない(scraped=0 のまま)

モード2: 特定ページ更新(--update + --urls

  • 指定された URL のみを再スクレイプする
  • 新 URL の発見・追加はしない(recursive=false
  • --urls に指定された URL がアーカイブに存在しない場合は警告を出力して無視する

設定の復元と上書き

  • 元のクロール設定(並列数、インターバル、User-Agent、ignoreRobots 等)はアーカイブの info テーブルから復元する
  • CLI フラグで指定された値があれば、該当項目のみ上書きする
  • info テーブル自体は更新しない(元の設定を保持)

データの扱い

データ種別 全ページ更新 特定ページ更新
ページメタデータ(title, status 等) 上書き 対象ページのみ上書き
HTML スナップショット 上書き 対象ページのみ上書き
アンカー(リンク情報) 事前削除 → 再取得 対象ページ分のみ事前削除 → 再取得
画像情報 事前削除 → 再取得 対象ページ分のみ事前削除 → 再取得
リソース参照関係 対象ページ分のみ事前削除 → 再取得 対象ページ分のみ事前削除 → 再取得
リソース(共有テーブル) 削除しない 削除しない
分析データ(プラグイン結果) 破棄される 破棄される

出力

  • 元のアーカイブファイルを上書き保存する
  • 分析データは破棄されるため、更新後に再度 analyze コマンドの実行が必要

エッジケース

ケース 期待動作
再クロールで 404 が返る status=404 でページデータを上書き
リダイレクト先が変わった 旧リダイレクト情報をリセットし、新しいリダイレクト先を記録
--urls に存在しない URL を指定 警告を stderr に出力し、存在する URL のみ処理して正常完了
全更新で到達不能なページ scraped=0 のまま残る(明示的削除はしない)
アンカー重複 事前に旧データを削除するため発生しない

変更対象パッケージ

  • @nitpicker/crawler — Database 層・Archive 層・CrawlerOrchestrator への更新メソッド追加
  • @nitpicker/clicrawl コマンドへの --update / --urls フラグ追加

テスト要件

ユニットテスト

  • 更新対象 URL 取得: 全件取得、URL 指定時のフィルタ、存在しない URL の除外
  • ページ関連データのクリア: anchors / images / resources-referrers の削除、scraped フラグのリセット

E2E テスト

  1. クロール → アーカイブ保存 → 全ページ更新 → ページデータが最新に更新されていることを検証
  2. クロール → アーカイブ保存 → 特定 URL 更新 → 指定ページのみ更新され、他ページは変更なし
  3. 存在しない URL を指定 → 警告出力の上、正常完了

既存インフラの活用

  • Archive.open() によるアーカイブ展開
  • archive.getConfig() による元設定の復元
  • archive.write() による ZIP/TAR 書き出し
  • Crawler.start() / Crawler.startMultiple() による再帰/非再帰クロール
  • Database.updatePage() の upsert パターン
  • --resume の実装パターン(CLI ディスパッチ、設定復元のフロー)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions