もったかぶった

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

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

[反省]
前回のコードだと重複しているタイトルに対応してなかったので修正しました。修正箇所の説明はこちら。
Springer Nature社の無料公開教科書をかき集めて2 - もったかぶった


[要約]

PDFをダウンロードするためのWEBスクレイピングの話です。

 

[本文]

もったです。

 

突然ですが僕は無料のコンテンツが好きです。
SNSなんかで「〇〇が無償公開される!」とか、「△△が今だけ無料ダウンロード可能!」という情報が流れると乞食根性剥き出しで群がってしまうのが人の常ですね。単純に棚ぼたで高価なものが手に入る喜びもありますが、こういう機会でもないと読まないような本との出会いがあるのも嬉しいところです。

 

 

前置きは以上です。

今回はSpringer Nature様が提供してくれている参考書達をせかせかとローカルドライブへ落とすためのスクリプトを組みます。


www.springernature.com


最近コロナウイルスの影響で様々な教育コンテンツが無償で公開されています。本当にありがとうございます。折角なので感謝の念だけではなく、学べるものは学んでいきましょう。

 

参考書達をダウンロードするためのソースコードは下記です。


github.com

 

 下記のモジュールをimportしています。必要に応じて適宜インストールしてください。

pandas
requests
xlrd

 

説明part
仕様としてpdfファイルのタイトルとURLの入ったエクセルファイルを入力とし、ダウンロードしてきたpdfをローカルフォルダへ出力するシステムを考えます。
今回はエクセルファイルを受けるにはpandasを使い、pdfのダウンロードにはrequestsを使っていきます。


エクセルファイルを読み込む。(ここでxlrdをインストールしていないとエラーが出ます)

df = pd.read_excel('./Free+English+textbooks.xlsx')


読み込んだエクセルファイルから必要な列を抜き出す。今回はタイトル列とURL列。
エクセルファイルに書かれているのはpdfファイルの直接の在り処ではなかったので、直接pdfに繋がるようURLをごちゃごちゃ書き換える。
ついでに保存するpdf名用にタイトルも取得する。このときファイル名に使用禁止の文字を全て取り除く。

df = pd.read_excel('./Free+English+textbooks.xlsx')
df_URL = df['DOI URL'].astype(str)
df_URL = df_URL.str.replace("http://doi.org/","HOGEHOGE")
df_URL = df_URL.str.replace('/','%2F')
df_URL = df_URL.str.replace('HOGEHOGE','https://link.springer.com/content/pdf/')
df_URL = df_URL + '.pdf'
download_url_list = df_URL.values.tolist()

df_TITLE = df['Book Title']
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()


ファイル出力部。
読み込んだ2列を片っ端からダウンロードして名付けていく。
ついでに処理経過が分かりやすいようになにをダウンロードしているか、なにがダウンロードし終わったのかコンソールへ出力させる。

for (download_url, download_title) in zip(download_url_list, download_title_list):
    title = str(download_title)
    print('DOWNLOADING...: ' + title, end='\r')
    # 一秒スリープ
    time.sleep(1)
    r = requests.get(str(download_url))
    print('GET           : ' + title)
    # ファイルの保存
    if r.status_code == 200:
        with open(title + '.pdf', "wb") as f: 
            f.write(r.content)
            f.close()|<


ファイルのダウンロード部分。

    r = requests.get(str(download_url))


ファイル書き込み部分。ダウンロードが上手くいったらさっき取得した本のタイトルでpdfを書きだす。

    if r.status_code == 200:
        with open(title + '.pdf', "wb") as f: 
            f.write(r.content)
            f.close()|<


以上でエクセルファイルにリストアップされたpdfを自動でダウンロードしてくるwebスクレイピングスクリプトの説明は終わりです。
皆さんも快適な在宅ライフをお過ごしください。