okaryo.log

読書メーターの読書記録をJSON形式で出力するスクリプトを作りました! | okaryo.log

読書メーターの読書記録をJSON形式で出力するスクリプトを作りました!

    #個人開発#Kotlin#読書記録#Scraping#Jsoup#Selenium

作ったもの

読書メーターの読書記録をJSON形式で出力するスクリプトを作りました!

Githubはこちら

CLIでコマンドを呼び出すと以下のようなJSONを出力します。

{
  "recordsCount": 1,
  "records": [
    {
      "date": "2021-11-06",
      "review": "review content",
      "book": {
        "author": {"name": "G パスカル ザカリー"},
        "page": 455,
        "title": "闘うプログラマー[新装版] ビル・ゲイツの野望を担った男達(Kindle)",
        "url": "https://www.amazon.co.jp/dp/product/B00GSHI04M/ref=as_li_tf_tl?camp=247&creative=1211&creativeASIN=B00GSHI04M&ie=UTF8&linkCode=as2&tag=bookmeter_book_image_image_pc_logoff-22"
      }
    }
  ],
  "totalPages": 455
}

言語はKotlinを使っていて、JsoupSeleniumを使って読書メーターのページを読み込み、JSONにフォーマットします。

使い方

  1. gradlewが動く環境を用意する
  2. 以下のコマンドを打ち込む

./gradlew run --args="[user id] [output file name]"

例) ./gradlew run --args="739784 main.json

  1. .generated/main.jsonに読書記録が生成されます

コマンドの引数について

コマンドの引数には3パターンあります。

  1. 読書メーターのユーザーIDだけを引数として渡すと、JSONファイルは生成されず、コンソールにJSONが出力されます。

./gradlew run --args="739784"

  1. 第二引数にファイル名を渡すと、渡された名前のファイルが./generatedディレクトリ以下に生成されます。

./gradlew run --args="739784 main.json"

  1. 第三引数にonly-diffという文字列を渡すと、第二引数で渡したファイルのJSONとの差分の読書記録だけを読書メーターから取得します。差分だけとってくるので実行時間はかなり削減されます(こだわりポイント!)。

./gradlew run --args="739784 main.json only-diff"

詰まったところ

Jsoupを使って読書メーターのHTMLを取得し、解析していますが、リクエストがたまに失敗していました。

解決方法としては、リクエストの間隔をリクエストに失敗するごとに伸ばしていくことで解決しました。

スクレイピングのマナーとしてリクエストの間隔は最低1秒取るようにしていましたが、そのままではリクエストに失敗することがよくあったので、リクエストに失敗するごとに1秒ずつ間隔を伸ばすようにするとうまくいきました。

おわり

読書メーターの記録をJSONとして手元に持っておきたいといった方はぜひ使ってみてください!

その他、このアプリケーションを作る中で得た知見を別の記事として書こうと思います。


関連記事
最新記事
プロモーション

This site uses Google Analytics.