概要
既存の .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/cli — crawl コマンドへの --update / --urls フラグ追加
テスト要件
ユニットテスト
- 更新対象 URL 取得: 全件取得、URL 指定時のフィルタ、存在しない URL の除外
- ページ関連データのクリア: anchors / images / resources-referrers の削除、scraped フラグのリセット
E2E テスト
- クロール → アーカイブ保存 → 全ページ更新 → ページデータが最新に更新されていることを検証
- クロール → アーカイブ保存 → 特定 URL 更新 → 指定ページのみ更新され、他ページは変更なし
- 存在しない URL を指定 → 警告出力の上、正常完了
既存インフラの活用
Archive.open() によるアーカイブ展開
archive.getConfig() による元設定の復元
archive.write() による ZIP/TAR 書き出し
Crawler.start() / Crawler.startMultiple() による再帰/非再帰クロール
Database.updatePage() の upsert パターン
--resume の実装パターン(CLI ディスパッチ、設定復元のフロー)
概要
既存の
.nitpickerアーカイブに対して、特定ページまたは全ページを再クロールして更新する機能を追加する。現在は「クロール → アーカイブ保存 → 分析」の一方向フローのみで、サイトのコンテンツ変更を反映するには毎回ゼロからクロールし直す必要がある。この機能により、既存アーカイブを開いて再スクレイプし、最新のデータで上書きできるようになる。
背景・動機
--resume(中断再開)は既にあるが、「完了済みアーカイブの再クロール」は未対応要件
CLI インターフェース
crawlコマンドに--update(-U)フラグを追加する。--resumeと同じパターンで、アーカイブファイルパスを引数に取る。モード1: 全ページ更新(
--updateのみ)scraped=0のまま)モード2: 特定ページ更新(
--update+--urls)recursive=false)--urlsに指定された URL がアーカイブに存在しない場合は警告を出力して無視する設定の復元と上書き
infoテーブルから復元するinfoテーブル自体は更新しない(元の設定を保持)データの扱い
出力
analyzeコマンドの実行が必要エッジケース
status=404でページデータを上書き--urlsに存在しない URL を指定scraped=0のまま残る(明示的削除はしない)変更対象パッケージ
@nitpicker/crawler— Database 層・Archive 層・CrawlerOrchestrator への更新メソッド追加@nitpicker/cli—crawlコマンドへの--update/--urlsフラグ追加テスト要件
ユニットテスト
E2E テスト
既存インフラの活用
Archive.open()によるアーカイブ展開archive.getConfig()による元設定の復元archive.write()による ZIP/TAR 書き出しCrawler.start()/Crawler.startMultiple()による再帰/非再帰クロールDatabase.updatePage()の upsert パターン--resumeの実装パターン(CLI ディスパッチ、設定復元のフロー)