-
Notifications
You must be signed in to change notification settings - Fork 0
feat(crawler): アーカイブ更新機能(--update フラグ)の追加 #23
Copy link
Copy link
Open
Description
概要
既存の .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 ディスパッチ、設定復元のフロー)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels