Epublifier - オフライン読書向けのページ(書籍、マニュアル)スクレイピングツール
(github.com/maoserr)- Epublifier は、ウェブサイトの HTML ページ一覧を抽出して ePub 書籍としてコンパイルし、ユーザーが選んだ eReader に持ち込めるようにするブラウザー拡張機能
- JavaScript を書ける上級ユーザーは、追加の パーサー定義 を加えて特定サイトのパース方法をカスタマイズ可能
- 対応対象は Novel Update、Wuxia World、awesome-read-the-docs に含まれる多数のサイト、UL/OL 目次・リンクテキスト正規表現・query selector ベースのカスタムサイト、タイトル要素と Next ボタンを持つ カスタム Web アプリ
- ブラウザー内で実行されるため、JavaScript で動的にテキストを生成または取得するサイトでもページを処理でき、マウスクリックで主要要素を選択する UI ベースのスクレイピング を提供
- 繰り返し実行するバックグラウンド作業や堅牢な専用スクレイパーを目的としたものではなく、すでに他のプログラムがうまく処理できるサイトでは、専用設定のあるツールより優れた性能は期待しにくい
Epublifier がすること
- Epublifier はウェブサイトを ePub に変換するツール
- ウェブサイトから HTML ページ一覧を抽出し、それを ePub 書籍としてコンパイルして、ユーザーが好みの eReader に取り込めるようにする
- JavaScript を書けるユーザーは、追加の パーサー定義 を入れて任意のサイトのパースをカスタマイズできる
- 使い方は wiki で確認できる
対応サイトとページ構造
- 現在の対応対象は以下のとおり
-
Novel Update
-
Wuxia World
- awesome-read-the-docs に含まれる多数のサイト
- UL/OL 要素を目次として使うカスタムサイト
- リンクテキストに対する正規表現または query selector を使うカスタムサイト
- あらかじめ定義されたタイトル(header)要素とクリック可能な Next ボタンを持つ カスタム Web アプリ
-
インストール
- Firefox 拡張は Firefox Add-ons からインストール可能
- Chrome 拡張は Chrome Web Store からインストール可能
使用例
- Novel Update での ページ一覧抽出 の例がある
- Wuxia World で Next ボタンをたどりながら Web アプリを巡回 する例がある
- FastAPI ドキュメントのような他のドキュメントサイトでの ドキュメント抽出 の例がある
ブラウザー拡張として作った理由
- このツールは、従来のリクエストベース CLI スクリプトや、開いているタブ・ウィンドウを基準に取得する一部の Chrome 拡張ではうまくスクレイピングできないウェブサイトで、一時的な ePub 生成 を行うためのもの
- 既存の CLI スクレイパーや他の拡張はたいてい事前定義されたサイト向けに作られており、その範囲外のサイトには合わないことがある
- 一部のツールは少なくない設定やコード記述を必要とする
- 一部のサイトは JavaScript でテキストを動的に生成または取得するため、ブラウザーが JavaScript を実行する必要がある
- この点が Epublifier を作る最大のギャップだった
- ブラウザー内で実行されるため、検出やブロックの対象になりにくい可能性もある
想定する使い方と制限
- Epublifier は堅牢なスクレイパーや、繰り返し実行される バックグラウンド予約作業 のためのツールではない
- スクレイピング対象の主要要素を UI 上で選択するようにした理由も、この使い方に沿っている
- サイトごとの設定がなくても比較的簡単に、数回のマウスクリックだけで取得できるよう 汎用性 を目指している
- すでに他のプログラムや拡張がうまく処理できるサイトであれば、それらのツールはそのサイト向けに調整されているため、Epublifier のほうがうまく動作するわけではない
- コーディングや設定に多くの時間を使わず、あるサイトを一度か二度スクレイピングしたい場合に向いている
ビルド
- ビルド環境は Windows 10 と NPM 8.1.2
- ビルド手順は以下のとおり
- NPM をインストール
- ルートディレクトリで
npm installを実行 - Firefox 向けに
npm run build_ffを実行 - Chrome 向けに
npm run buildを実行
使用コンポーネント
- ePub 生成には jEpub を使用
1件のコメント
Hacker News のコメント
この拡張機能が他のスクレイパーと違うのは、従来型のスクレイパーではうまく取得できないサイトで 一時的に EPUB を生成するためのツールだからです。
通常、コマンドラインのスクレイパーや他の拡張機能は、対応サイトがあらかじめ決まっているか、設定やコードがかなり必要です。
また、サイトによっては JavaScript で本文を動的に生成したり取得したりするため、ブラウザが直接 JavaScript を実行する必要があり、そこが最大の穴でした。
ブラウザ内で実行されるので、検知やブロックを受ける可能性も低いかもしれません。
繰り返し実行されるバックグラウンドの予約ジョブのように堅牢に使うことを目的にしているわけではなく、そのため取得する主要要素を選ぶ UI があります。
特定サイト向けの設定なしでも、マウスクリック数回で一度か二度スクレイピングする手間を減らすためのツールで、すでに他のプログラムや拡張機能がうまく処理できるサイトなら、そちらのほうがよいでしょう。
同じサイトに長く留まるほうではないので作りました。
似たものを自分で作ったことがある立場からすると、このツールで興味深いのは、任意のサイトからのコンテンツ抽出を反復的に調整する UI です。
抽出プロセス全体を GUI で扱える点は、一般的な方法よりはるかに柔軟です。
すべてのセクションが展開しないと見えない アコーディオン UI の背後にあり、1つを展開すると別のセクションが折りたたまれるサイトまで処理できるなら、本当にすばらしいと思います。
今、私もかなり似たものを作っています。
ブログや主にウェブ小説などのための ウェブスクレイパー と EPUB パーサーを作り、カテゴリやタグとともにデータをデータベースに保存します。
複数作品の読書進捗を追跡し、同じ物語の複数バージョン(ウェブ小説と出版版 EPUB)を保管できる、オフライン読書用 PWA も一緒に作っています。
Calibre は非常に多くのサイトをサポートしています。
https://github.com/JimmXinu/FanFicFare
https://github.com/JimmXinu/FanFicFare/wiki/SupportedSites
以前、ブログを Kindle に送るために、似たような Kindle-send[0] を作りました。内部では readability を使っています。
今はブログ、本、ときにはウェブサイト全体のアーカイブを送るのに使っていて、スクリプトからも利用できます。
Kindle のハイライトを Obsidian にエクスポートできるので、こうした EPUB を作るとハイライトを一か所に集められる利点があります。
名前は kindle-send ですが、本の送信方法としてメールを使う電子書籍リーダーならどこへでも送れます。
[0] https://github.com/nikhil1raghav/kindle-send
似たものを Unix ターミナル向けに、Web ページ・Gopher・Gemini を対象として作ったことがあります: Offpunk
https://sr.ht/~lioploum/offpunk/
EPUB の代わりに、Gopher はテキストファイル、Gemini は Gemini ファイル、Web ページは HTML+画像としてキャッシュに保存します。
~/.cache/offpunkで階層構造を見たり、Offpunk から直接訪問したりできます。tour機能を使うと、ドゥームスクロールの代わりに、テキストモードですべての記事を順番に最後まで読むことになります。Epublifier に似たツールはいくつかあります。
https://epub.press/
https://github.com/dteviot/WebToEpub
https://dotepub.com/
すっきりしています。
以前このコンセプトのシンプルなバージョンを作り、サーバーのファイルシステムに EPUB ファイルを保存して、それを自分の電子書籍リーダーと同期していました。
https://github.com/solarkraft/webpub
中核となる素材は、Web サイトを簡略化された「文書」ビューにしてくれる Postlight Parser です。
http://fanfiction.net/ もサポートしていますか? このサイトについては簡単な解決策を見つけられませんでした。
ある程度は動作しますが、うまくいく物語もあれば、最初のページだけ取得する物語もあります。
コンテンツを取得するには、ヘッドレスブラウザを使う以外にうまく動く方法を見たことがありません。