見出し画像

[ python ] html にあるリンク先のpdfファイルを自動的にダウンロードする。

概要 この記事は,コマンドを使って,ファイルの文字コードの調べ方について説明しています。初心者を対象にわかりやすく,説明することを心がけています。


目的

あるサイトに pdf ファイルへのリンクが複数ある。自動的に pdf ファイルを全てダウンロードしたい。

準備

具体例があったほうがわかりやすい。そこで,公益財団法人全国高等学校体育連盟が公開している加盟登録状況の pdf をダウンロードすることにしよう。そのサイトの URL は以下のとおり。

手順

手順1 目的の html ファイルをダウンロードする

curl https://www.zen-koutairen.com/reg_total.html > temp.html

コマンドラインで curl を使う。取得したデータは temp.html という名前をつけて保存する。

手順2 ダウンロードした html ファイルの文字コードを調べる

あとで Python をつかって pdf ファイルをダウンロードします。Python のコードを書くときに必要な情報のひとつが,ダウンロードしたファイルの文字コードです。

nkf で --guess をつけて,以下のようにタイプすると文字コードを教えてくれます。

$ nkf --guess temp.html
Shift_JIS (LF)

今回は Shit_JIS であることがわかります。

手順3 pdf ファイルがあるディレクトリを確認しておく

Google Chrome や Safari などのブラウザで,目的のページにアクセスします。pdf のリンクを右クリックして,リンク先の URL をコピーします。

実際にやってみると,リンク先は https://www.zen-koutairen.com/pdf/reg-reiwa06.pdf?2024re でした。ファイル名の前のパスを Python のコードを書くときに使います。ここでパスは https://www.zen-koutairen.com/pdf/ です。

手順4 Python のコードを書く

リンク先のファイルをダウンロードするために以下の Python のコードを使います。ただ,2箇所,修正するところがあります。

import sys
import requests
from bs4 import BeautifulSoup

def download_pdfs_from_html(html_file):

    # nkf で文字コードを調べておく
    #
    # nkf --guess temp.html で文字コードがわかります。
    # Shit_JIS -> shift-jis
    # EUC      -> euc_jp
    # UTF-8    -> utf-8
    #
    with open(html_file, 'r', encoding='shift-jis') as f:
        soup = BeautifulSoup(f, 'html.parser')

    base_url = "https://www.zen-koutairen.com/"
    
    for link in soup.find_all('a'):
        href = link.get('href')
        if href and href.endswith('.pdf'):
            try:
                full_url = base_url + href
                response = requests.get(full_url)
                response.raise_for_status()

                # ファイル名を変更 (例: オリジナルのファイル名に"zenkoutairen_"を追加)
                #
                filename = "zenkoutairen_" + href.split('/')[-1]
                # ダウンロード先パスを指定
                #
                download_path = "https://www.zen-koutairen.com/pdf/" + filename

                with open(filename, 'wb') as f:
                    f.write(response.content)
                    print(f"ダウンロード完了: {download_path}")
            except requests.exceptions.RequestException as e:
                print(f"ダウンロードエラー: {full_url} ({e})")
# 使い方
# python3 downloads.py [ ダウンロードした html ファイル名  ]
#
html_file = sys.argv[1]
download_pdfs_from_html(html_file)

修正1 14行目で html ファイルを読み込もうとしています。その際,読み込む html ファイルの文字コードを指定します。

with open(html_file, 'r', encoding='shift-jis') as f:

手順1で html ファイルの文字コードを調べましたが,それに応じて encoding='' のなかに書き込みます。

Shit_JIS だったら,shift-jis。EUC だったら euc_jp, UTF-8 だったら utf-8 とします。

修正2 17行目でダウンロードしたいファイルのパスを書きます。手順3でコピーしたパスをダブルクォーテーションの中に書き込みましょう。

base_url = "https://www.zen-koutairen.com/"

手順5 python のコードを実行する

python3 downloads.py temp.html

手順4で作ったコードに downloads.py と名前をつけた場合,上のようにするとダウンロードをしてくれます。もしかしたら,requests がないとか,bs4 がないとかいったメッセージが出るかもしれません。それらのライブラリーがインストールできていないためです。

より学びたい方へ

コマンドを使い,時間のかかる仕事を自動化する方法が学べます。

Linux/Unixユーザー,Cygwinを利用するWindowsユーザー、Mac OS Xユーザーもbashを使いますね。bash の使い方を知ることで,いつもの作業がより簡単になるでしょう。

シェルスクリプトの書き方,デバッグ方法といったシェルスクリプティングの基礎から,各種ツールとの連携まで詳しく書かれています。

Python を使った単純な繰り返し作業の自動化の仕方がくわしく説明されています。

[ サイトマップを見る ]


いいなと思ったら応援しよう!