未来はあまりに遠いし、おれはもう待てない

SF小説やプログラミングの話題を中心とするフジ・ナカハラのブログ

Web小説をスクレイピングして電子書籍にする

超・SF作家育成サイト の小説をEPUBに変換してKindleで読めるようにした。 以下のスクリーンショットは、MaciBooksEPUBを開いたときのものである。 もちろん、作成した電子書籍は、私的利用の範囲内でしか使用していない。

f:id:fuji-nakahara:20180714015055p:plainf:id:fuji-nakahara:20180714015132p:plain

動機

超・SF作家育成サイトは、ゲンロン 大森望 SF創作講座 の受講生作品が読めるWebサイトである。 かくいう私自身もこの講座の受講生だが、他の受講生作品を読むにはこのサイトにアクセスする必要がある。

しかし、このサイトは決して使いやすいとはいえない。 まず、WrodPress製のサイトそのものが非常に重く、どのページにアクセスしても描画まで1秒以上かかる。 肝心の作品ページも、文章が読みやすくなるような工夫が特になされているわけでもない。 このサイトでいくつもの作品を長時間読むのは、私にとってストレスでしかなかった。

私は小説を電子書籍で読む派で、2012年からKindleを使い続けている。 Kindleであれば、ストレスを感じることなく文章を読むことができる。

ここで、マークダウンを電子書籍に変換する でんでんコンバーター というサービスのことを思い出した。 超・SF作家育成サイトのテキストをでんでんコンバーターの入力形式に変換すれば、Kindleで受講生作品を読めるのではないか? そう考えて、私はその変換を行うコードを書きはじめた。

方法

思いついた方法は、次のとおりである。

  1. 超・SF作家育成サイトをスクレイピングする
  2. スクレイピングしたHTMLをメタデータと共にデータベースに入れる
  3. O/Rマッパーを使って、データベースのデータをでんでんコンバーターの入力形式に変換する

スクレイピングしたデータを直接変換せずに一度データベースに入れるのは、生のデータを手元に残すことで、サイトにアクセスすることなくローカルで試行錯誤できるようにするためである(繰り返しになるが、超・SF作家育成サイトは非常に重い)。 また、メタデータと共にデータベースに入れておけば、種々のデータ分析も行える。

プログラミング言語には使い慣れたRubyを用いた。さらに、ActiveRecordActiveSupportを利用したかったので、オーバースペックとは思いつつもRuby on Railsプロジェクトとして開始した。ソースコードは、GitHubリポジトリ fuji-nakahara/genron-school-sf-app で公開している。

まず、超・SF作家育成サイトの構造を調査して、データベースを設計した。 具体的な内容は schema.rb を参照してほしい。 ポイントは、講座の年度と受講生の関係が1対多ではなく、多対多であることだ。 複数の年度にまたがる受講生がいる。

スクレイピングには Nokogiri を用い、 ActiveJobとして実装した。 たとえば、 ScrapeSynopsesJob は梗概をスクレイピングしてデータベースに保存するジョブである。

超・SF作家育成サイトは随時更新されるため、その度にスクレイピングし直す必要がある。 1時間に一度、更新の可能性がある課題のみをチェックするようにしてこれを自動化した。 合わせて、サイトに更新があったことを通知するTwitter bot @genron_sf_bot も作成した。

でんでんマークダウンへの変換はrakeタスクにした。 denden.rake がこれにあたる。 これにより、以下のコマンドを実行するだけで、SUBJECT_ID=1 の課題に対する全作品を1冊の電子書籍をまとめるためのファイル群が生成される。 ファイル群には、でんでんコンバーターの設定ファイル ddconv.yml や、独自のスタイルを定義したcssファイルも含まれる。

$ bundle exec rake denden:create SUBJECT_ID=1

あとは、生成されたファイル群をそのままでんでんコンバーターに投げるだけである。


最後に、超・SF作家育成サイトのコンテンツは著作物である。 スクレイピングしたデータは、私的利用や情報解析以外の目的で用いてはならない。 また、スクレイピングを行う際も、対象サイトのルールを守り、過度な負荷をかけることのないよう配慮する必要がある。