2011/01/26

wget vs curl - コマンドラインダウンロードツール頂上決戦

「wget」って便利ですよね。
僕はPHPerなので、PHPを使ってcronを回したい時は、今ならCLIモードを利用してバッチを書きますが、以前はそんな事できなかった。PHPでバッチ処理するには、wgetでlocalhostのURLを叩きに行くのが手っ取り早かったんです(もちろん、外からのアクセスへの対策も行いつつ)。
そんなこんなでよく使うwgetですが、先日node.jsをインストールした時に出てきた、curlというツールも同じような内容のツールだと感じました。

って事は、どっちが強いか決めるのがジャンプ世代じゃないですかね?




では早速それぞれがどういうソフトウェアだと説明されているか見てみます。
wgetとは
GNU Wget is a free utility for non-interactive download of files from the Web.
ということで、「GNU Wgetはウェブからファイルを非対話的(コマンドラインツールですから)にダウンロードするためのフリーソフトウェアだぜ」との事です。

対してcurlとは
curl is a tool to transfer data from or to a server.
という感じで、「curlはサーバーにデータを送受信(from or to)するツールでっせ」という事で、wgetとは違ってダウンロードツールとは明記していません。

wgetはgeturl(wgetの前身)時代も含めると1996年に始まったプロジェクトです。また、curlは1997年に始まったプロジェクトです。wgetの方が少し先輩ですね。
両者とも、10年を越えて継続され続けているプロジェクトだけあって、しっかり作り込まれていて素晴らしいツールです。
なにせ、manページに掲載されているオプションの数! 全部使うことはないでしょうね・・・。ニッチなニーズにも対応してくれそうな予感です。

wgetは、ダウンロードに特化している分、書式が簡単です(個人的感覚)。特に
wget -r http://www.example.com/
のような再帰的にダウンロードを試みるオプションなどは重宝しますね!

かたやcurlは、URLの指定が柔軟(個人的超感覚)です。
curl http://www.example.com/eroero[0-100].jpg
これで画像だけを収集できます。性の扉を叩いたくらいの年で、このツールを知ってしまったらお猿さん確定ですね。こえー!

wgetでも「-A」オプションで正規表現は利用できますが、アスタリスクがメタ文字ではなく単なるワイルドカード的な扱いだったり、どっちかというとコマンドラインでファイル名を指定する感覚に似ているようです。

オプションがありすぎて、正直なところ、まとめようがない(言っちゃった!)ところもあるんですが、完全に好みですね。

wgetはGNUプロジェクトですので、OSがLinuxならば、標準でインストールされているでしょう。Linux環境でcurlを利用するには、yumやapt-get(ソースコンパイルももちろんOK)する必要があります。というか、node.jsの時はapt-getしました(ホント便利だよなぁ)。

かたやMac OSには、標準でcurlがインストールされているようです。wgetは敢えてインストールしない限り利用できないようです。この辺はうまく住み分けできているのかな?
PHPer的な発想で言うと、cronやバッチではwgetを使うくせにcurlはPHPでサポートされている(curlというか、内部関数として、curlのライブラリであるlibcurlを呼び出せる)ので、PHPの中ではcurlを使うんですね。

正直、僕が時間をかけてクローラーをこしらえるより、wgetでサササとバッチを書いたほうが正確・高速・低コストという恐ろしい(いや素晴らしい!!)結果。

実践的な使い方をまとめるのはまたの機会に・・・。

see also
curl の基本的な使い方 -コマンド編-
curl の基本的な使い方 -コマンド編- その2
curl の基本的な使い方 -設定編-
Wget は必ず最新版を使います
wgetでリンク切れリストを取得する


2 件のコメント:

  1. >wgetでも「-A」オプションで正規表現は利用できますが、アスタリスクがメタ文字ではなく単なるワイルドカード的な扱いだったり、どっちかというとコマンドラインでファイル名を指定する感覚に似ているようです。

    それ、正規表現じゃあらへん。

    wget --help によると --accept-regexや--reject-regexで正規表現が使えることになってるけど、試したらダメだった。

    返信削除
  2. コメントありがとうございます!

    正規表現ではないですね。今考えれば単なるファイル名のパターンを指定するだけでした。
    どういう心境で書いたかもう忘れましたが、ここでお詫びしたいと思います。

    >wget --help によると --accept-regexや--reject-regexで正規表現が使えることになってるけど、試したらダメだった。

    改めて調べましたが、wgetで正規表現は使えないようです。
    ちなみにいうと、--accept-regexや--reject-regexというオプションは見当たらなかったですね。grepかけただけですが:-)
    私が今回調査に利用したwgetのバージョンは以下の通りです。
    GNU Wget 1.13.4 built on linux-gnu.

    過去のバージョンや他のOSでの実装では使えるのかも知れません。

    返信削除