【python】~webサイト上のpdfを一括ダウンロードする~

【python】~webサイト上のpdfを一括ダウンロードする~

あいさつ

仕事している中で「あるwebサイト上のpdfファイルを一括でダウンロードしたいなぁ~」って思うことがあったので、pythonでプログラムを作成してみました。

ソースコード

早速ですがソースコードを紹介したいと思います。

コードは以下になります。

from bs4 import BeautifulSoup
import os
import requests
import time
import sys

args = sys.argv

if len(args) < 2:
    print("Arguments are too short")
    sys.exit()


download_urls = []
BASE_URL = args[1].rsplit('/', 1)[0] + '/'

if os.path.exists("tmp_folder") == False:
    os.mkdir("tmp_folder")
    
html = requests.get(args[1])

soup = BeautifulSoup(html.text, "lxml")
links = soup.find_all("a")

for link in links:
    h_ref = link.get("href")
    
    if h_ref and ".pdf" in h_ref:
        download_urls.append(h_ref)
        
for download_url in download_urls:
    file_name = download_url.split("/")[-1]
    r = requests.get(BASE_URL + download_url)
    time.sleep(1)
    
    if r.status_code == 200:
        with open(os.path.join("tmp_folder", file_name), "wb") as f:
            f.write(r.content)

機能について簡単に説明します。

今回のプログラムはAnaconda Prompt上で実行しています。Anacondaを使用しない場合は、BeautifulSoupをインポートする必要があるので、各自で設定が必要です。

プログラムの中身ですが、コマンドライン引数でpdfを取得したいサイトのURLを貼り付けます。張り付け忘れたとしてもプログラムが誤動作しないようにエラー処理機能を追加しています。

基本的には以下のコマンドで実行できます。

$python pdf_dl.py "pdfをダウンロードしたいサイトのURL"

上記コマンドを実行すると、pdf_dl.pyを置いてあるフォルダ内にtmp_folderというフォルダを新規に作り、その中にダウンロードしたpdfファイルを1秒ごとに保存していきます。

まとめ

ネットで調べていたら参考になるプログラムが紹介されていたのでそれを元に今回のプログラムを作成しました。

誤字や変数名違いを直し、コマンドライン引数の取得とエラー処理機能を追加したものになります。

このプログラムが他の人の役に立てば幸いです。