ページからリンクされているファイルを一括ダウンロードする

#119
2025.2.23
2025.2.23

あるページから直接リンクされているファイルのうち、特定の拡張子を持つものだけを全てダウンロードしたいことがたまにある。例えば講義資料のPDFとか。もちろん右クリック+"Save Link As..."で保存できるのだけど、数が多いと面倒くさい。

Node.jsとかで一括ダウンロードツールを作るということも勿論可能だとは思うけれど、私が考えるより簡単で単純明快な方法は、ブラウザの開発者コンソールとwgetを用いるというもの。

最初に、ページを開いた状態で、以下のスクリプトを開発者コンソールで実行し、ダウンロードしたいファイルのURLの一覧を保存する。patternの正規表現は、抽出したいものにあわせて適宜変更する。

// 抽出するURLのパターン: RegExp | null
pattern = /\.pdf$/;
// URLリストのファイル名: string
listName = 'urls.txt';

function downloadText(text, fileName) {
  const a = document.createElement('a');
  a.href = URL.createObjectURL(new Blob([text], { type : 'plain/text' }));
  a.download = fileName;
  a.click();
}

list = [...document.querySelectorAll('a')]
  .filter(anchor => pattern == null || pattern.test(anchor.href))
  .join('\n');
downloadText(list, listName);

ダウンロードすべきURLのリスト(urls.txt)が得られたので、実際にファイルを一括ダウンロードする。wgetには、ファイルに含まれるURLを全てダウンロードする-iオプションがあるので、これを用いることで一括ダウンロードが行える。

% wget -i urls.txt

curlの場合は、このようなオプションが存在しないが、xargsを用いてURLを一行ずつ渡すことで同様のことが実現できる。

% xargs -n 1 curl -O < urls.txt