読書メーターからブクログに読了本のデータを移行する

5年位前から読書メーターで読みたい本と読み終わった本と感想の管理をしていたのだが、だんだん非公開にできないのが不満になってきた。これは読書メーターが読書好きが集まるSNS(率直にいってXXXXXだ)を標榜しており5年前の私がそれに気が付かなかったから仕方がないことなのだが、読む本もそこに書く感想も割と赤裸々なものがあり、一切非公開にできないのは、ちょっと。 思想の自由を守れ。

耐えきれなくなったので1年前にブクログに移行した。その際、読みたい本一覧についてはどうしようもないので選別も兼ねて手動でデータを移行した。これは読書メーターがXXXXXなサービスでインポートサービスがあるにも関わらずエクスポートサービスがないから。ちなみにブクログはどちらもある。
150冊くらいデータがある読了本(シリーズは最初の一冊しか登録してなかったり職の本を端折ったりしているから実際は多分5年でもうちょい読んでますよ:読書する人間的自意識主張)に関しては、流石に手作業で移行するのは面倒でそのまま置いておいた。スクレイピングとやらができれば抽出できると知ったけど、Rのその辺りはよくわからなかったので諦めた。1年前の私に解説すると、スクレイピングとはそのパソコンに命令して君の代わりにネット上の情報収集をやらせることでありこれをすると例えば昔書いたスコアアタックモデルのデータ入力パートが省略できるようになったりするよ。
そういう状況だったのだが春に転職してあれがそっち系になったので、pythonの練習をかねてコードを書いた。これでXXXXXサービスとはおさらば。ヨッシャッ!
まず読書メーターのどのページから情報を拾ってくるか決める。一年程前に書かれた記事によると、当時は読んだ本まとめみたいなコードが生成できたらしいのだが、読書メーターの仕様変更で一切できなくなっていた。すごいな。こんなに早く一方的に情報が無価値になることがあるのか。
ログインしたあとの読書管理ページのリストから拾うことにした。これは若干失敗で、読了本とそれ以外(未読本とか)のページの書式が違ったので、読了本にしか使えないコードになっちゃった。まぁいっか……。
#ログイン
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lxml import html
import time
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get(“https://bookmeter.com/login”)
# ID/PASSを入力
id = driver.find_element_by_id(“session_email_address”)
id.send_keys(“YYYYY”)
password = driver.find_element_by_id(“session_password”)
password.send_keys(“ZZZZZ”)
time.sleep(1)
# ログインボタンをクリック
login_button = driver.find_element_by_name(“button”)
login_button.click()
できた~。うれし~。
ブクログにインポートする時に必要なデータを調べる。ISBN(13桁)が読書メーター側のリストに入ってなかったので面倒だなと思ったけど、これは必ずしも必要ないことがわかった。最低限必要なのはASIN(カンフージェネレーション)だけみたいだ。あとはレビューと読了日付を引っ張ってきたいな。
#読了日付リスト
date_list = []
for i in range(1,9):
    url = “https://bookmeter.com/users/WWWWW/books/read?display_type=list&page={}”.format(i)
    driver.get(url)
    date = driver.find_elements_by_class_name(“detail__date”)
    for i in date:
        date_list.append(i.text)
    time.sleep(1)
読了日付はユニークなクラス名があるので難しくなかった。
#ASIN関数
import re
def extract_asin(string):
    asin = re.search(pattern=r”(?<=asin\”:\”).+?(?=\”)”, string=string)
    return asin.group()
#review関数
def extract_rev(string):
    review = re.search(pattern=r”(?<=\”review\”:{\”text\”:\”).+?(?=\”)”,
                     string=string)
    if(review is None):
        return “”
    else:
        return review.group()
#ASINとレビューのリスト
asin_list = []
rev_list = []
for i in range(1,9):
    url = “https://bookmeter.com/users/WWWWW/books/read?display_type=list&page={}”.format(i)
    driver.get(url)
    #モーダルウィンドウ
    content = driver.find_element_by_class_name(“detail__edit”)
    content2 = content.find_element_by_xpath(“div”)
    string = content2.get_attribute(“data-modal”)
    content_list = driver.find_elements_by_class_name(“detail__edit”)
    for i in range(len(content_list)):
        content2 = content_list[i].find_element_by_xpath(“div”)
        string = string = content2.get_attribute(“data-modal”)
        asin_list.append(extract_asin(string))
        rev_list.append(extract_rev(string))
    time.sleep(1)
こっちが面倒だった……。モーダルウィンドウとかいうページ上で立ち上がるウィンドウがあるのだが、その要素の指定の仕方がわからなかった。クラスで名指ししようとしてもエラーが出るし……。結局モーダルウィンドウの手前のdivを指定してから、階層を一つ下げてパスで指定した。なんでこれでうまくいくのか一切わからん。詳しい人がいたら教えて下さい。
モーダルウィンドウの中身の取り出し方も最初わからなかった。多分こっちはget_attributeであっていると思う。出てくる文章は200文字くらいのタグ等含む文字列なのであとは正規表現で取り出し。正規表現もよくわからね~。宇宙人の言語か?見た目が記号の乱舞になるので本当に宇宙人の言語みたいに見える。正規表現って100年くらい歴史があるらしいけど、作った人絶対面白がってやったでしょ。
import pandas as pd
import csv
date_list2 = list(map(lambda x: str(pd.to_datetime(x, format=”%Y/%m/%d”)), date_list))
df = pd.DataFrame({“serviceID”: “1”,
                   “itemID”:asin_list, 
                   “ISBN”:””,
                   “category”:”-“,
                   “eval”:””,
                   “statement”:”読み終わった”,
                   “review”:rev_list, 
                   “tag”:”読メ”,
                   “memo”:””,
                   “regist_date”:date_list2,
                   “finish_date”:date_list2})
df.to_csv(“out.txt”, encoding=”cp932″, sep=”,”, index=False,
          header=False, quoting=csv.QUOTE_ALL)
あとはブクログの形式にあわせてデータフレームで加工。encordingはさくっといったけどquotingとダブルクオーテーション挿入の仕様がいまいちわからずしばし苦戦。
できた~!丸一日かかった~!面白かったからまぁいいか~。

家が1R→1Kに拡張されて(1Kは1+Kなのにワンルームのこと1Rって略記するのおかしくない?)、料理を複数品作り、それをリビングに運ぶというプロセスが生じるようになった。
……お盆、いるな。

町に暮らす

十年近く住んだ関西圏を離れて生まれ育った関東圏に戻ることになった。

とても悲しい。私は関西が大好きだ。主に愛しているのは大学時代を過ごした京都だが、関西のことは全部好きだ。そして東京という街が大体嫌いだ。
それを東京に暮らす妹に伝えると「私は姉と東京で会えるの嬉しいのに!」(何故か私は彼女のことを「妹」と呼ぶし、彼女もそれを真似てか私の事を「姉」と呼ぶ)と言われて驚いた。私だってその点については全く同意であったからだ。
私の中で「東京という街に暮らすのが嫌」ということと「東京に住むことで親しい人達に会えるのが嬉しい」という事象はかなり独立だと気が付いた。後者は前者を打ち消す理由にならない。
「生まれ育った場所が嫌い」と言うと、あぁきっと小さい頃は友達が全然いなくて家庭環境もよくなかったのが大学で外に出ていい経験をしたんだろうな……といった想像をされるのかもしれないが、別に東京が嫌いなのはそういった理由ではない。友達おるわ。じゃあ何故よと言われると困るが、東京という街が昔から好きでないのだ。
そういえば高校生の頃からずっと、瀬戸内海に面した町に住みたいと言っている。これも特に理由はない。大体、瀬戸内沿岸の町を訪れた事さえほとんどないのだ。でも瀬戸内海に住みたい。東京から関西に越して少しは接近したと思ったのに残念だ。生涯をかけてじりじりとお近付きになるしかないのか。
思うに、私は町のイメージの中に暮らしている。東京に住む人達は、東京という盆の上に今乗っている菓子なのであって、菓子が好きでも盆は食べられない。菓子は明日には盆を飛び出していってしまうかもしれない。私には何の断りもなく。
そういう訳なので、私の近所に住む皆様は私が物理的に側にいる間が機会と思って大いに酒を飲んでください。そして側を離れた後も一緒に酒を飲んでください。

新聞社の有料記事を読みたいことがある。

買い切りはできなくて、会員登録が必要だ。一月辺り千円くらい。会員登録すると読めるようにある記事は山のようにあるが、あくまで興味をもった記事を読みたいだけなのでメールアラートを片っ端から切る。
また別の有料記事を読みたいことがある。
読んでみようか、とクリックするとこれは別の新聞社の記事なので会員登録が必要だ。一月辺り千円くらい。
以下同じ。
……。
Komifloは偉大だなぁ。

デイリーポータルZをはげます会に入って一年が経った。

厳密に言うと、はげます会の前身である「友の会」にも入っていたのだが、入って一ヶ月経たず、何のグッズも貰わないまま「はげます会」が始まったので、私にとってデイリーポータルZのファンクラブとは、はげます会のことである。
概要を説明しないまま詳細を説明してしまった。
デイリーポータルZ、読んでますか?私は平成のインターネット・キッズだったのでデイリーポータルZは盆と正月に会う気のいい親戚の兄貴みたいな存在だ。でも一度離れて(反抗期)、ここ二、三年でまた読みだした。
昨年、デイリーポータルZは事業主が変わり、ファンクラブである「友の会」は「はげます会」になった。「友の会」では会員宛に変なグッズを送るので会員が増えるほど赤字という謎のシステムだったのだが、「はげます会」はそのような目に見える特典はない。はげます会の会費(月1000円税別)はほぼそのままデイリーポータルZの収益になる。いわばパトロンである。そう書いてあった。
パトロン!
興奮した。パトロンの字に興奮してデイリーポータルZはげます会に入ったと言ってもいい。この手のクリエイター支援サービスも普及してきたが、特典とかいらんのである。いや、特典があってもいいが、特典があるなら最早そういう「サービス」だと思って受け取る。でもデイリーポータルZはパトロンだと言っている。パトロン、いいな。響きもいい。セト・ランヴァルト・フォン・ノースメイア殿下もハマっちゃう訳だぜ。
デイリーポータルZは人気者なので稀によく記事が流行る。最近はフライドポテトの記事がヒットをかました(これhttps://dailyportalz.jp/kiji/compare-french_fries最近のDPZは記事のURLにも遊び心が加えられている。知ってた?)。普段デイリーポータルZの話をしない人がデイリーポータルZの話をしていると嬉しい。やっておるのう、と思う。高みからコメントしている。何故なら私はパトロンだからだ!(でも私はカバー祭り最高の記事はこれhttps://www.youtube.com/watch?v=mk60riBjlyEだと思うよ。これは内輪なネタがある記事を理解しちゃえるパトロンアピ)
私はインターネットオモシロをツイッターで共有するのが若干苦手なのだが(何故なら世界で一番面白い人間は私だと思っているからです)、はげます会に入ってからデイリーポータルZの話ができるようになった。私はパトロンだからデイリーポータルZの話をしてもいいのだ!!!(静粛に!アザラシをびっくりさせないようにしてくださいhttps://dailyportalz.jp/kiji/doyo-otayori2019-10-12)。
友の会にはあったグレードが、はげます会からはなくなったのもよかった。石油王にパトロンマウント取られたくないので。友の会ではグッズが貰える「松コース」と貰えない「梅コース」があって、私は後者だった。何故ならグッズは欲しくなかったから……。
全人類デイリーポータルZをはげます会に入ろう!
嘘、全人類に入られると私のパトロン感が薄れるからやめて。ほかほかおにぎりクラブに入ってください。