2017

1

4

Linuxコマンドのwgetでクロールしてやんよ!!!

スポンサードリンク


wgetとは

HTTP/FTPを使ってサーバーからファイルをダウンロードするためのオープンソース
コマンド「wget URL」で指定したURLのファイルをダウンロードします。

wgetのインストール(Homebrew)

まず、wgetが実行環境にインストールされているか確認。
何も返ってこなければインストールの必要がありますので、「brew」「yum」「apt-get」等のパッケージマネージャーでインストールします。
# wgetのインストール状態を確認
$ which wget
--> インストール済みなら「/usr/local/bin/wget」が返る
# 何も返ってこなければwgetをインストール
$ brew install wget

wgetの使い方

指定ページをダウンロード

# Yahooのトップページをダウンロード
$ wget https://www.yahoo.co.jp/
--> 2017-01-01 00:00:00 (2.67 MB/s) - `index.html' へ保存終了 [18503]

# ダウンロードしたファイルを確認
$ ls
--> index.html
インストールできたら指定したURLのページをカレントディレクトリにダウンロードします。

ファイル名や保存ディレクトリを指定してダウンロード

# ダウンロード用のフォルダを作成する
$ mkdir download

# 作成した「download」フォルダの中にファイル名を「yahoo.html」に指定してダウンロード
$ wget -O download/yahoo.html https://www.yahoo.co.jp/
--> 2017-01-01 00:00:00 (1.89 MB/s) - `download/yahoo.html' へ保存終了 [18503]

# ダウンロードしたファイルを確認
$ cd download
$ ls
--> yahoo.html
ダウンロード先やファイル名を指定する場合は「-O」オプションをつける事で指定できます。
「wget -O - URL」としてさらに"-"ハイフンを後ろに追加する事でファイルとして保存せずにソースコードを出力する事ができます。

再帰的にダウンロード

# qiitaのトップから2階層を再帰的に1ページを3秒間隔でダウンロード
$ wget -r -l2 -w3 https://qiita.com
クロール対象がトップページ(1階層)以下のディレクトリもクロール対象にする場合は再帰的(ディレクトリ内に存在するものに一つ一つに対して巡る)処理も可能です。

※ポータルサイトなどの、巨大なディレクトリ階層を持つサイトのトップドメインのURLなどを指定してしまうと、終わらない戦いになり対象サーバーに負荷がかかり大変な迷惑がかかる(というか業務妨害)ため、常識的に3秒程度のダウンロード間隔を設けた上で、本当に収集が必要なカテゴリ(ディレクトリ)URLまで対象を絞るか、基本的には"-l1"(1階層のみ)を指定しましょう。


特定の拡張子のファイルだけをダウンロードする

$ wget -r -l1 -A jpg,png,gif https://qiita.com
画像ファイルのみをダウンロードしたい場合は"-A"オプションを使う事で指定した拡張子のみをダウンロード対象にする事が可能。

特定の拡張子のファイルだけをダウンロード対象から外す

$ wget -r -l1 -R jpg,png,gif https://qiita.com
逆に画像ファイルはダウンロード対象から外したい場合は"-R"オプションを使う事で指定した拡張子のみをダウンロード対象にしない事が可能。

親ディレクトリをクローリングの対象から外す

# qiitaの「タイムライン」ページを対象に親ディレクトリを外して再帰的に1ページを3秒間隔でダウンロード
$ wget -r -np -w3 https://qiita.com/timeline

wgetコマンドのオプション

スタートアップ

-V--version バージョン情報を表示して終了
-h--helpこのヘルプを表示
-b--backgroundスタート後にバックグラウンドに移行
-e--execute=COMMAND `.wgetrc'形式のコマンドを実行

ログと入力ファイル

-o--output-file=FILEログを FILE に出力
-a--append-output=FILEメッセージを FILE に追記
-q--quiet 何も出力しない
-v--verbose 冗長な出力を(デフォルト)
-nv--no-verbose冗長ではなく
--report-speed=TYPE 帯域幅を TYPE で出力します。TYPE は 'bits' が指定できます。
-i--input-file=FILE FILE の中に指定された URL をダウンロード
-F--force-html入力ファイルを HTML として扱う
-B--base=URLHTML で入力されたファイル(-i -F)のリンクを指定した URL の相対 URL として扱う
--config=FILE 設定ファイルを指定
--no-config 設定ファイルを読みこまない
--rejected-log=FILE 拒否された理由をログ FILE に保存

ダウンロード①

-t--tries=NUMBERリトライ回数の上限を指定 (0 は無制限).
--retry-connrefused 接続を拒否されてもリトライ
--retry-on-http-error=ERRORSコンマ区切りで指定したHTTPのエラーの場合リトライ
-O--output-document=FILEFILE に文書を書きこむ
-nc, --no-clobber存在しているファイルをダウンロードで上書きしない
--no-netrc.netrc から認証情報を取得しない
-c--continue部分的にダウンロードしたファイルの続きから始める
--start-pos=OFFSETOFFSET からダウンロードを開始
--progress=TYPE進行表示ゲージの種類を TYPE に指定
--show-progressどのモードでも進捗バーを表示
-N--timestampingローカルにあるファイルよりも新しいファイルだけ取得
--no-if-modified-sinceタイムスタンプモードの時に、if-modified-since get リクエストを使わない
--no-use-server-timestampsローカル側のファイルのタイムスタンプにサーバのものを使わない
-S--server-response サーバの応答を表示
--spider何もダウンロードしない
-T--timeout=SECONDS 全てのタイムアウトを SECONDS 秒に設定
--dns-timeout=SECSDNS 問い合わせのタイムアウトを SECS 秒に設定
--connect-timeout=SECS 接続タイムアウトを SECS 秒に設定
--read-timeout=SECS 読み込みタイムアウトを SECS 秒に設定
-w--wait=SECONDSダウンロード毎に SECONDS 秒待つ
--waitretry=SECONDS リトライ毎に 1〜SECONDS 秒待つ
--random-wait ダウンロード毎に 0.5*WAIT〜1.5*WAIT 秒待つ
--no-proxyプロクシを使わない
-Q--quota=NUMBERダウンロードバイト数の上限を指定
--bind-address=ADDRESS ローカルアドレスとして ADDRESS (ホスト名か IP) を使う
--limit-rate=RATE ダウンロード速度を RATE に制限
--no-dns-cacheDNS の問い合わせ結果をキャッシュしない
--restrict-file-names=OSOS が許しているファイル名に制限
--ignore-case ファイル名/ディレクトリ名の比較で大文字小文字を無視

ダウンロード②

-4--inet4-onlyIPv4 だけを使う
-6--inet6-onlyIPv6 だけを使う
--prefer-family=FAMILY 指定したファミリ(IPv6, IPv4, none)で最初に接続
--user=USER ftp, http のユーザ名を指定
--password=PASS ftp, http のパスワードを指定
--ask-passwordパスワードを別途入力
--use-askpass=COMMAND 認証情報(ユーザ名とパスワード)を取得ハンドラを指定します。COMMAND が指定されない場合は、環境変数 WGET_ASKPASS か SSH_ASKPASS が使われます。
--no-iriIRI サポートを使わない
--local-encoding=ENC指定した ENC を IRI のローカルエンコーディングに
--remote-encoding=ENC 指定した ENC をデフォルトのリモートエンコーディングに
--unlink上書き前にファイルを削除
--xattr turn on storage of metadata in extended file attributes

ディレクトリ

-nd--no-directoriesディレクトリを作らない
-x--force-directories ディレクトリを強制的に作る
-nH--no-host-directories ホスト名のディレクトリを作らない
--protocol-directories プロトコル名のディレクトリを作る
-P--directory-prefix=PREFIX ファイルを PREFIX/ 以下に保存
--cut-dirs=NUMBER リモートディレクトリ名の NUMBER 階層分を無視

HTTP オプション

--http-user=USERhttp ユーザ名として USER を使う
--http-password=PASShttp パスワードとして PASS を使う
--no-cacheサーバがキャッシュしたデータを許可しない
--default-page=NAMEデフォルトのページ名を NAME に変更します通常は `index.html' です
-E--adjust-extensionHTML/CSS 文書は適切な拡張子で保存
--ignore-length `Content-Length' ヘッダを無視
--header=STRING 送信ヘッダに STRING を追加
--compression=TYPE圧縮アルゴリズムの指定: autoかgzipかnone(デフォルトはnone)
--max-redirectページで許可最大転送回数
--proxy-user=USER プロクシユーザ名として USER を使う
--proxy-password=PASS プロクシパスワードとして PASS を使う
--referer=URL Referer を URL に設定
--save-headersHTTP のヘッダをファイルに保存
-U--user-agent=AGENTUser-Agent として Wget/VERSION ではなく AGENT を使う
--no-http-keep-aliveHTTP の keep-alive (持続的接続) 機能を使わない
--no-cookiesクッキーを使わない
--load-cookies=FILE クッキーを FILE から読みこむ
--save-cookies=FILE クッキーを FILE に保存
--keep-session-cookies セッションだけで用いるクッキーを保持
--post-data=STRINGPOST メソッドを用いて STRING を送信
--post-file=FILEPOST メソッドを用いて FILE の中味を送信
--method=HTTPMethod "HTTPMethod" をヘッダのメソッドとして使います
--body-data=STRINGSTRING をデータとして送る。--method を指定してください。
--body-file=FILEファイルの中味を送る。--method を指定してください。
--content-disposition Content-Disposition ヘッダがあればローカルのファイル名として用いる (実験的)
--content-on-errorサーバエラー時に受信した内容を出力
--auth-no-challenge サーバからのチャレンジを待たずに、Basic認証の情報を送信します。

HTTPS (SSL/TLS) オプション

--secure-protocol=PRセキュアプロトコルを選択 (auto, SSLv2, SSLv3, TLSv1, TLSv1_1, TLSv1_2, PFS)
--https-only安全な HTTPS のリンクだけたどる
--no-check-certificate サーバ証明書を検証しない
--certificate=FILEクライアント証明書として FILE を使う
--certificate-type=TYPE クライアント証明書の種類を TYPE (PEM, DER) に設定
--private-key=FILE秘密鍵として FILE を使う
--private-key-type=TYPE 秘密鍵の種類を TYPE (PEM, DER) に設定
--ca-certificate=FILE CA 証明書として FILE を使う
--ca-directory=DIRCA のハッシュリストが保持されているディレクトリを指定
--crl-file=FILE CRL ファイルを指定
--pinnedpubkey=FILE/HASHES 公開鍵 (PEM/DER) ファイル、もしくは、base64でエンコードしたsha256ハッシュ値(sha256//で始まりセミコロン区切り)を指定して、相手を認証します。
--random-file=FILESSL PRNG の初期化データに使うファイルを指定
--egd-file=FILE EGD ソケットとして FILE を使う
--ciphers=STR GnuTLSの優先度かOpenSSLの暗号リストを直接指定注意して使ってください。--secure-protocol を上書きします。フォーマットや文法は SSL/TLS 実装に依存します。

HSTS オプション

--no-hsts HSTS を使わない
--hsts-file HSTS データベースのパス (デフォルトを上書き)

FTP オプション

--ftp-user=USERftp ユーザとして USER を使う
--ftp-password=PASSftp パスワードとして PASS を使う
--no-remove-listing`.listing' ファイルを削除しない
--no-glob FTP ファイル名のグロブを無効に
--no-passive-ftp"passive" 転送モードを使わない
--preserve-permissionsリモートのファイルパーミッションを保存
--retr-symlinks再帰取得中に、シンボリックリンクでリンクされた先のファイルを取得

FTPS オプション

--ftps-implicit implicit FTPS を使う (デフォルトポートは 990)
--ftps-resume-ssl 制御接続で開始した SSL/TLS セッションをデータ接続で再開
--ftps-clear-data-connection 制御チャネルだけ暗号化(データは平文になる)
--ftps-fallback-to-ftpサーバが FTPS に対応していない場合は FTP に

WARC オプション

--warc-file=FILENAMEリクエスト/レスポンスデータを .warc.gz ファイルに保存
--warc-header=STRINGwarcinfo record に STRING を追加
--warc-max-size=NUMBERWARC ファイルのサイズの最大値を NUMBER に設定
--warc-cdxCDX インデックスファイルを書く
--warc-dedup=FILENAME 指定した CDX ファイルに載っている record は保存しない
--no-warc-compression WARC ファイルを GZIP で圧縮しない
--no-warc-digests SHA1 ダイジェストを計算しない
--no-warc-keep-logWARC record にログファイルを保存しない
--warc-tempdir=DIRECTORYWARC書込時の一時ファイルを置くディレクトリを指定

再帰ダウンロード

-r--recursive 再帰ダウンロードを行う
-l--level=NUMBER再帰時の階層の最大の深さを NUMBER に設定(0 で無制限)
--delete-afterダウンロード終了後、ダウンロードしたファイルを削除
-k--convert-links HTML や CSS 中のリンクをローカルを指すように変更
--convert-file-only URLのファイル名部分だけ変換(いわゆるbasename)
--backups=Nファイルに書きこむ時に N ファイルのバックアップをローテーションさせる
-K--backup-convertedリンク変換前のファイルを .orig として保存
-m--mirror-N -r -l 0 --no-remove-listing の省略形
-p--page-requisites HTML を表示のに必要な全ての画像等も取得
--strict-comments HTML 中のコメントの処理を厳密に

再帰ダウンロード時のフィルタ

-A--accept=LISTダウンロード拡張子をコンマ区切りで指定
-R--reject=LISTダウンロードしない拡張子をコンマ区切りで指定
--accept-regex=REGEX許容URLの正規表現を指定
--reject-regex=REGEX拒否URLの正規表現を指定
--regex-type=TYPE 正規表現のタイプ (posix)
-D--domains=LISTダウンロードドメインをコンマ区切りで指定
--exclude-domains=LIST ダウンロードしないドメインをコンマ区切りで指定
--follow-ftpHTML 文書中の FTP リンクも取得対象に
--follow-tags=LIST取得対象にタグ名をコンマ区切りで指定
--ignore-tags=LIST取得対象にしないタグ名をコンマ区切りで指定
-H--span-hosts再帰中に別のホストもダウンロード対象に
-L--relative相対リンクだけ取得対象に
-I--include-directories=LIST 取得対象にディレクトリを指定
--trust-server-names ファイル名としてリダイレクト先のURLの最後の部分を使う
-X--exclude-directories=LIST 取得対象にしないディレクトリを指定
-np––no-parent 親ディレクトリを取得対象にしない



トップへ