読書メーターの読書記録をJSON形式で出力するスクリプトを作りました!
作ったもの
読書メーターの読書記録をJSON形式で出力するスクリプトを作りました!
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
を使っていて、Jsoup
とSelenium
を使って読書メーターのページを読み込み、JSONにフォーマットします。
使い方
gradlew
が動く環境を用意する- 以下のコマンドを打ち込む
./gradlew run --args="[user id] [output file name]"
例) ./gradlew run --args="739784 main.json
.generated/main.json
に読書記録が生成されます
コマンドの引数について
コマンドの引数には3パターンあります。
- 読書メーターのユーザーIDだけを引数として渡すと、JSONファイルは生成されず、コンソールにJSONが出力されます。
./gradlew run --args="739784"
- 第二引数にファイル名を渡すと、渡された名前のファイルが
./generated
ディレクトリ以下に生成されます。
./gradlew run --args="739784 main.json"
- 第三引数に
only-diff
という文字列を渡すと、第二引数で渡したファイルのJSONとの差分の読書記録だけを読書メーターから取得します。差分だけとってくるので実行時間はかなり削減されます(こだわりポイント!)。
./gradlew run --args="739784 main.json only-diff"
詰まったところ
Jsoup
を使って読書メーターのHTMLを取得し、解析していますが、リクエストがたまに失敗していました。
解決方法としては、リクエストの間隔をリクエストに失敗するごとに伸ばしていくことで解決しました。
スクレイピングのマナーとしてリクエストの間隔は最低1秒取るようにしていましたが、そのままではリクエストに失敗することがよくあったので、リクエストに失敗するごとに1秒ずつ間隔を伸ばすようにするとうまくいきました。
おわり
読書メーターの記録をJSONとして手元に持っておきたいといった方はぜひ使ってみてください!
その他、このアプリケーションを作る中で得た知見を別の記事として書こうと思います。