【Narou.rb】「小説が削除されています」は嘘だった?ダウンロードエラーの真犯人は“たったひとつの改行”
私が愛用しているWeb小説管理ツール「Narou.rb」。Dockerコンテナ上で稼働させ、日々の更新を自動で収集し、電子書籍化してくれる頼もしい相棒です。しかし先日、ある特定の新作小説をダウンロードしようとしたところ、頑なに拒否される事態が発生しました。
ログには無情にもこう表示されます。
[ERROR] 小説が削除されているか非公開な可能性があります [ERROR] https://ncode.syosetu.com/n8281jr/ の目次データが取得出来ませんでした
「ああ、削除されてしまったのか」と諦めるのは簡単です。しかし、ブラウザでアクセスするとその小説は元気に連載中でした。 これはサーバーからの挑戦状です。今回は、Narou.rbが「削除された」と誤認した原因を突き止め、設定ファイル(YAML)を修正して解決に至るまでの記録です。
ミッション:冤罪を晴らし、収集を再開せよ
今回の目的は、「実在する小説を正しく認識させ、ダウンロードを成功させること」です。
Webスクレイピングツールにおいて、対象サイトのデザイン変更やHTML構造の揺らぎによる取得失敗は宿命です。しかし、エラーメッセージが「削除された」となっている以上、ツールは「ページそのものが見つからない(あるいは解析不能)」と判断しています。
目指すゴール(定量目標)は以下の通りです。
- ターゲット小説(ID: n8281jr)のダウンロード成功(進捗100%)
- 今後同様の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の揺らぎ」の衝突でした。
- エラーログを疑う:「削除された」と言われても、まずはブラウザとcurlで実在確認を。
- 正規表現の罠:.(ドット)は万能ではない。HTML解析において「改行」は常に敵となりうる。
- YAMLの柔軟性:定義ファイルを少し書き換えるだけで、ツールは再び息を吹き返す。
納戸のような狭いサーバーの中でも、こうした小さな「修理」を積み重ねることで、快適な読書環境は守られています。 もし同じように「特定の小説だけ落ちてこない」という現象に遭遇した方は、ぜひ定義ファイルの「タイトル周りの正規表現」を疑ってみてください。
それでは、良きサーバーライフを。