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=URL | HTML で入力されたファイル(-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=FILE | FILE に文書を書きこむ |
-nc, --no-clobber | 存在しているファイルをダウンロードで上書きしない |
--no-netrc | .netrc から認証情報を取得しない |
-c | --continue | 部分的にダウンロードしたファイルの続きから始める |
--start-pos=OFFSET | OFFSET からダウンロードを開始 |
--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=SECS | DNS 問い合わせのタイムアウトを 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-cache | DNS の問い合わせ結果をキャッシュしない |
--restrict-file-names=OSOS | が許しているファイル名に制限 |
--ignore-case | ファイル名/ディレクトリ名の比較で大文字小文字を無視 |
ダウンロード②
-4 | --inet4-only | IPv4 だけを使う |
-6 | --inet6-only | IPv6 だけを使う |
--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-iri | IRI サポートを使わない |
--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=USER | http ユーザ名として USER を使う |
--http-password=PASS | http パスワードとして PASS を使う |
--no-cache | サーバがキャッシュしたデータを許可しない |
--default-page=NAME | デフォルトのページ名を NAME に変更します通常は `index.html' です |
-E | --adjust-extension | HTML/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-headers | HTTP のヘッダをファイルに保存 |
-U | --user-agent=AGENT | User-Agent として Wget/VERSION ではなく AGENT を使う |
--no-http-keep-alive | HTTP の keep-alive (持続的接続) 機能を使わない |
--no-cookies | クッキーを使わない |
--load-cookies=FILE | クッキーを FILE から読みこむ |
--save-cookies=FILE | クッキーを FILE に保存 |
--keep-session-cookies | セッションだけで用いるクッキーを保持 |
--post-data=STRING | POST メソッドを用いて STRING を送信 |
--post-file=FILE | POST メソッドを用いて FILE の中味を送信 |
--method=HTTPMethod | "HTTPMethod" をヘッダのメソッドとして使います |
--body-data=STRING | STRING をデータとして送る。--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=DIR | CA のハッシュリストが保持されているディレクトリを指定 |
--crl-file=FILE | CRL ファイルを指定 |
--pinnedpubkey=FILE/HASHES | 公開鍵 (PEM/DER) ファイル、もしくは、base64でエンコードしたsha256ハッシュ値(sha256//で始まりセミコロン区切り)を指定して、相手を認証します。 |
--random-file=FILE | SSL PRNG の初期化データに使うファイルを指定 |
--egd-file=FILE | EGD ソケットとして FILE を使う |
--ciphers=STR | GnuTLSの優先度かOpenSSLの暗号リストを直接指定注意して使ってください。--secure-protocol を上書きします。フォーマットや文法は SSL/TLS 実装に依存します。 |
HSTS オプション
--no-hsts | HSTS を使わない |
--hsts-file | HSTS データベースのパス (デフォルトを上書き) |
FTP オプション
--ftp-user=USER | ftp ユーザとして USER を使う |
--ftp-password=PASS | ftp パスワードとして 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=STRING | warcinfo record に STRING を追加 |
--warc-max-size=NUMBERWARC | ファイルのサイズの最大値を NUMBER に設定 |
--warc-cdx | CDX インデックスファイルを書く |
--warc-dedup=FILENAME | 指定した CDX ファイルに載っている record は保存しない |
--no-warc-compression | WARC ファイルを GZIP で圧縮しない |
--no-warc-digests | SHA1 ダイジェストを計算しない |
--no-warc-keep-log | WARC 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-ftp | HTML 文書中の 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 | 親ディレクトリを取得対象にしない |