もったかぶった

プログラミングをしたりしなかったり

Springer Nature社の無料公開教科書をかき集めて2

[要約]
先日書いたコードだとSpringer Nature社の無料公開教科書全てをかき集めることができませんでした。反省。

[本文]
もったです。
先日下の記事を書きまして、思いのほかいろんな方に動かしてもらえました。触ってくださった方々、ありがとうございます。
Springer Nature社の無料公開教科書をかき集めて - もったかぶった
github.com



ただ教科書のタイトルに重複があることを見落としていまして、
先日書いたコードだと重複タイトルを無視して上書きしてしまう致命的な罠がありました。
生成したファイル数を数えればすぐに分かることなのですが、作った当初は万能感に包まれていて全く気付きませんでした。ご指摘くださったフォロワーさんに感謝です。

f:id:TmottaT:20200417001117p:plain
おわかりいただけただろうか・・・
今回はその辺を改良したのと、ついでに本当は実装したかった本のカテゴリ分けも実装したのでその辺の紹介をしていきます。

重複タイトル除けです。
スマートじゃないですが、cumcount()を使って同じタイトルの本をカウントして本のタイトルに追記します。このとき、大部分の本は重複していないので0カウント目はナンバリングしないことにします。
これでpdfファイルを保存するときにファイルの上書きをせずに済みます。

# PDF名に使う本のタイトルを拾ってくる。重複タイトルがあるので2つ目以降をナンバリングする。
df['dummy'] = df.groupby('Book Title').cumcount()
df_TITLE = df['Book Title'] + df['dummy'].astype(str).replace('0' , '')
df_TITLE = df_TITLE.str.replace('/', '')
df_TITLE = df_TITLE.str.replace(':', '')
df_TITLE = df_TITLE.str.replace('|', '')
df_TITLE = df_TITLE.str.replace('"', '')
df_TITLE = df_TITLE.str.replace('?', '')
df_TITLE = df_TITLE.str.replace('>', '')
df_TITLE = df_TITLE.str.replace('<', '')
df_TITLE = df_TITLE.str.replace('\\', '')
download_title_list = df_TITLE.values.tolist()

本のカテゴリ分けです。
エクセルファイルをよく見たらタイトルごとに大雑把なカテゴリ分けがされていたので、折角なのでカテゴリ分けを実装していきます。
カテゴリタイトルを取得して、事前にすべてのカテゴリのフォルダを作成します。このとき大量に重複フォルダを作成しますが、tryで囲んで例外を無視していきます。
本当はpython3.2以降ならmakedirs()の引数で重複フォルダを無視することができるのですが、今回はなんとなくこっちで書いてます。興味があれば調べてみてください。

# 折角本のカテゴリ分類があるので分類するためのフォルダを事前に作成する。
df_DIR = df['English Package Name'].astype(str)
download_dir_list = df_DIR.values.tolist()
for folder in download_dir_list:
    # Python3.2以降ならもっとスマートな書き方があるけどなんとなくこっち。
    try:
        os.makedirs('./' + folder)
    except FileExistsError:
        pass

あとは前回の反省を活かしてコンソールの進捗表示にはダウンロードしたファイル数を表示します。

f:id:TmottaT:20200417001216p:plain
前回の反省を活かした賢い表示

出力結果はこんな感じになります。

f:id:TmottaT:20200417001303p:plain
英語名のフォルダが並んでると開く気が起きないですよね・・・

これで今度こそSpringer Nature社の無料公開教科書を"全て"かき集めることができました。やったぜ。
皆さんも今度こそ快適な在宅ライフをお過ごしください。
僕はダウンロードしてきた教科書は読まずにゲームしてます。