[ 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 がないとかいったメッセージが出るかもしれません。それらのライブラリーがインストールできていないためです。
より学びたい方へ
コマンドを使い,時間のかかる仕事を自動化する方法が学べます。
Daniel J. Barrett(著)「Efficient Linuxコマンドライン」(O’Reilly Japan)
Linux/Unixユーザー,Cygwinを利用するWindowsユーザー、Mac OS Xユーザーもbashを使いますね。bash の使い方を知ることで,いつもの作業がより簡単になるでしょう。
Mokhtar Ebrahim、Andrew Mallett(著)「マスタリングLinuxシェルスクリプト 第2版」(O’Reilly Japan)
シェルスクリプトの書き方,デバッグ方法といったシェルスクリプティングの基礎から,各種ツールとの連携まで詳しく書かれています。
Cameron Newham, Bill Rosenblatt(著)「入門 bash 第3版」(O’Reilly Japan)
Python を使った単純な繰り返し作業の自動化の仕方がくわしく説明されています。
Al Sweigart(著)「退屈なことはPythonにやらせよう 第2版」(O’Reilly Japan)
[ サイトマップを見る ]