タイトル: wget http通信によるファイルダウンロード
SEOタイトル: wget コマンド完全ガイド — URL 指定/再帰/レジューム/認証/curl との違い
| この記事の要点 |
|
基本: URL を指定してダウンロード
wget は GNU プロジェクトのファイルダウンローダで、HTTP / HTTPS / FTP に対応。バックグラウンドでの大量ダウンロードや、サイト全体のミラーリングを行うのに使います。
# 基本: URL のファイルをカレントディレクトリに保存
wget https://example.com/foo.zip
# → ./foo.zip が保存される
# 保存名を変える
wget -O myfile.zip https://example.com/foo.zip
# 標準出力に書き出してパイプ
wget -O- https://example.com/archive.tar.gz | tar -xzf -
# ディレクトリ指定
wget -P /tmp/ https://example.com/foo.zip
# → /tmp/foo.zip
主要オプション一覧
| オプション | 意味 | 例 |
|---|---|---|
-O FILE | 保存ファイル名指定 | wget -O a.zip URL |
-P DIR | 保存ディレクトリ指定 | wget -P /tmp URL |
-c | レジューム(途中から再開) | wget -c URL |
-q | quiet (出力抑制) | cron 等で多用 |
-v | verbose | デバッグ用 |
-b | バックグラウンド実行 | wget-log に出力 |
-r | 再帰ダウンロード | ミラー時必須 |
--no-parent | 親ディレクトリ取得しない | 再帰時の暴走防止 |
-N | タイムスタンプ比較(新しいときだけ) | 差分同期 |
--limit-rate=N | 帯域制限 | --limit-rate=1m |
-t N | リトライ回数(既定 20) | -t 0 で無限 |
--timeout=N | タイムアウト(秒) | --timeout=30 |
--user-agent= | UA 偽装 | サーバ判定回避用 |
--header= | 任意ヘッダ追加 | 下記参照 |
--no-check-certificate | SSL 検証無効(非推奨) | 自己署名証明書 |
レジューム: 巨大ファイルが途中で切れたとき
# 途中で切れた 5GB のファイル
wget https://example.com/big.iso
# Ctrl+C や回線断で中断
ls -la big.iso
# -rw-r--r-- 1 user user 2147483648 May 10 10:00 big.iso ← 2GB で止まった
# -c で続きから
wget -c https://example.com/big.iso
# HTTP/1.1 206 Partial Content
# Length: 5368709120 (5.0G), 3221225472 (3.0G) remaining ...
# サーバが Range リクエスト未対応の場合は最初からやり直し
サイト丸ごとミラー(再帰ダウンロード)
# 配下を全部取得(深さ無制限)
wget -r --no-parent https://example.com/docs/
# よく使う安全な組み合わせ
wget --mirror --convert-links --adjust-extension --page-requisites \
--no-parent https://example.com/docs/
# 各オプション:
# --mirror : -r -N -l inf --no-remove-listing と同等
# --convert-links : ローカルで開けるようリンク書き換え
# --adjust-extension : .html を追加
# --page-requisites : 画像・CSS・JS も取得
# -l 2 : 深さ 2 階層まで
# -A "*.pdf" : PDF だけ
# -R "*.gif" : GIF 除外
認証付きダウンロード
# Basic 認証
wget --user=admin --password=secret https://example.com/private/file.zip
# .netrc を使えばパスワードを履歴に残さない
cat > ~/.netrc <<EOF
machine example.com
login admin
password secret
EOF
chmod 600 ~/.netrc
wget https://example.com/private/file.zip
# Bearer トークン (REST API)
wget --header="Authorization: Bearer eyJhbGc..." \
https://api.example.com/v1/data
# 任意のヘッダ複数指定
wget --header="X-Api-Key: abc123" \
--header="Accept: application/json" \
https://api.example.com/data
POST / Cookie / フォーム送信
# POST データ
wget --post-data="name=taro&age=20" https://example.com/api/save
# JSON POST
wget --header="Content-Type: application/json" \
--post-data='{"name":"taro"}' \
https://example.com/api/save
# Cookie を読み書き
wget --save-cookies cookies.txt --keep-session-cookies \
--post-data="user=foo&pass=bar" \
https://example.com/login
wget --load-cookies cookies.txt https://example.com/dashboard
curl との使い分け
| 用途 | 推奨 | 備考 |
|---|---|---|
| ファイルを保存 | wget | デフォルトでファイル保存 |
| サイト全体ミラー | wget | curl にはこの機能無し |
| レジューム | wget / curl 両対応 | wget の -c が楽 |
| REST API 叩く | curl | 豊富なメソッド/ヘッダ操作 |
| HTTP デバッグ | curl -v | レスポンスヘッダ確認 |
| 標準出力に流す | curl(デフォルト)/ wget -O- | パイプ用途 |
| 大量並列 | aria2c | 分割ダウンロード対応 |
スクリプタブルなバックアップ例
#!/bin/bash
# 毎日 cron で実行する DB バックアップ取得
set -euo pipefail
DATE=$(date +%Y%m%d)
DST=/backup/db
URL="https://backup.example.com/db/dump-${DATE}.sql.gz"
mkdir -p "$DST"
wget -q -c \
--timeout=60 \
--tries=3 \
--header="X-Api-Key: ${BACKUP_KEY}" \
-O "$DST/dump-${DATE}.sql.gz" \
"$URL"
# 検証 (gzip が壊れていないか)
gzip -t "$DST/dump-${DATE}.sql.gz" || {
echo "Broken gzip" >&2
exit 1
}
# 古いものを削除
find "$DST" -name "dump-*.sql.gz" -mtime +30 -delete
Windows での wget
# 方法1: PowerShell 標準
Invoke-WebRequest -Uri "https://example.com/foo.zip" -OutFile "foo.zip"
# エイリアスで wget も使える(PowerShell 5+)
wget https://example.com/foo.zip -OutFile foo.zip
# 方法2: Git Bash / WSL 同梱の wget
wget https://example.com/foo.zip
# 方法3: 公式 wget for Windows
# https://eternallybored.org/misc/wget/ からダウンロード
# C:\Windows\System32 に置けば cmd / PowerShell から使える
# 方法4: scoop / chocolatey
scoop install wget
choco install wget
よくあるトラブル
| 症状 | 原因 | 対処 |
|---|---|---|
403 Forbidden | UA 判定でブロック | --user-agent="Mozilla/5.0" |
certificate verification failed | 自己署名 / 期限切れ | 正しい証明書を入れる / 緊急時 --no-check-certificate |
| ファイル名が変 | リダイレクト後の URL から付与 | --content-disposition or -O |
| HTML だけ取得される | JavaScript で動的生成 | wget では不可。Playwright/Selenium 等 |
| すごく遅い | サーバ側帯域 / プロキシ | http_proxy 環境変数確認 |
FAQ
Q: 並列ダウンロードしたい
A: wget 単体では困難。aria2c -x 8 URL が分割並列ダウンロード対応で高速です。
Q: 認証情報がプロセスリストに見えてしまう
A: --user= はコマンドライン引数なので ps で見えます。~/.netrc 経由を推奨。
Q: 再帰の暴走を防ぎたい
A: 必ず --no-parent と -l N(深さ)を併用。--reject-regex で URL パターン除外も可能。