【Narou.rb】「小説が削除されています」は嘘だった?ダウンロードエラーの真犯人は“たったひとつの改行”

2026-01-25

私が愛用しているWeb小説管理ツール「Narou.rb」。Dockerコンテナ上で稼働させ、日々の更新を自動で収集し、電子書籍化してくれる頼もしい相棒です。しかし先日、ある特定の新作小説をダウンロードしようとしたところ、頑なに拒否される事態が発生しました。

ログには無情にもこう表示されます。

[ERROR] 小説が削除されているか非公開な可能性があります
[ERROR] https://ncode.syosetu.com/n8281jr/ の目次データが取得出来ませんでした

「ああ、削除されてしまったのか」と諦めるのは簡単です。しかし、ブラウザでアクセスするとその小説は元気に連載中でした。 これはサーバーからの挑戦状です。今回は、Narou.rbが「削除された」と誤認した原因を突き止め、設定ファイル(YAML)を修正して解決に至るまでの記録です。

目次

ミッション:冤罪を晴らし、収集を再開せよ

今回の目的は、「実在する小説を正しく認識させ、ダウンロードを成功させること」です。

Webスクレイピングツールにおいて、対象サイトのデザイン変更やHTML構造の揺らぎによる取得失敗は宿命です。しかし、エラーメッセージが「削除された」となっている以上、ツールは「ページそのものが見つからない(あるいは解析不能)」と判断しています。

目指すゴール(定量目標)は以下の通りです。

  1. ターゲット小説(ID: n8281jr)のダウンロード成功(進捗100%)
  2. 今後同様のHTML構造を持つ小説でもエラーを出さない堅牢な設定

捜査開始:なぜ「見えない」のか

まず、サーバー(Dockerコンテナ)からインターネットへの接続を確認しました。curl コマンドを使って、コンテナ内部から直接なろうのサーバーへアクセスしてみます。

docker-compose exec narou curl -I https://ncode.syosetu.com/n8281jr/

結果は HTTP/1.1 200 OK。 通信経路に問題はなく、CloudflareなどのWAF(ファイアウォール)にブロックされているわけでもありません。つまり、HTMLデータは手元に届いています。

データが届いているのに「取得できない」ということは、Narou.rbが持っている「ページ解析用の地図(正規表現)」と、実際の「地形(HTML)」が食い違っているということです。

疑われた容疑者たち

最初は、目次リストや更新日付のフォーマット変更を疑いました。日付の横に改行が入っているのか? タグのクラス名が変わったのか? 設定ファイル(ncode.syosetu.com.yaml)の subtitles(目次定義)や nu(更新日定義)を入念に見直しましたが、決定打に欠けます。

しかし、灯台下暗し。 解析が失敗していたのは、もっとも基本的な「タイトル」の部分でした。

解決策:改行という名の落とし穴

Narou.rbの設定ファイル(YAML)では、タイトルの取得ルールが以下のように記述されていました。

変更前(問題のあった記述)

# タイトル
t: <h1 class="p-infotop-title"><a href=".+?">(?<title>.+?)</a></h1>

これは正規表現として、「h1タグからaタグ閉じまでが1行で繋がっていること」を期待しています。正規表現のドット(.)は、通常「改行以外の任意の文字」にしかマッチしないからです。

しかし、今回ダウンロードできなかった小説のHTMLソースを確認すると、こうなっていました。

実際のHTML

<h1 class="p-infotop-title">
<a href="...">
崩壊世界の魔法杖職人
</a>
</h1>

h1タグとaタグの間、そしてタイトルの前後に改行が入っています。 この「たったひとつの改行」があるために、上記の正規表現(.+?)ではマッチせず、Narou.rbは「タイトルが見つからない=これは小説ページではない=削除されたに違いない」と誤った結論を出していたのです。

修正パッチの適用

原因が分かれば修正は簡単です。YAMLの記述を「複数行(改行)」に対応させれば良いのです。 docker-compose の volumes 機能を使って、修正したYAMLファイルをコンテナにマウントさせます。

変更後(修正したYAML)

# タイトル
# |- を使うことで、改行を含んだ文字列として定義する
t: |-
<h1 class="p-infotop-title">
<a href=".+?">(?<title>.+?)</a>
</h1>

このように、HTMLの構造に合わせて改行を入れる(あるいは [\s\S]+? のように改行を含む正規表現を使う)ことで、パーサーは正しくタイトルを認識できるようになりました。

この修正ファイルを適用し、再度ダウンロードコマンドを実行。

docker-compose exec narou narou download n8281jr

結果、今まで頑なに拒否されていたのが嘘のように、DL進捗バーが走り出しました。

納戸工房的まとめ

今回のトラブルは、システムのバグではなく、「厳密すぎる定義」と「HTMLの揺らぎ」の衝突でした。

  1. エラーログを疑う:「削除された」と言われても、まずはブラウザとcurlで実在確認を。
  2. 正規表現の罠:.(ドット)は万能ではない。HTML解析において「改行」は常に敵となりうる。
  3. YAMLの柔軟性:定義ファイルを少し書き換えるだけで、ツールは再び息を吹き返す。

納戸のような狭いサーバーの中でも、こうした小さな「修理」を積み重ねることで、快適な読書環境は守られています。 もし同じように「特定の小説だけ落ちてこない」という現象に遭遇した方は、ぜひ定義ファイルの「タイトル周りの正規表現」を疑ってみてください。

それでは、良きサーバーライフを。