LinuxやMacで使えるwgetコマンドで手軽にWebサイトをスクレイピング(ローカルにまるごと保存)する方法をまとめておきます。Selenium不要でラクラクにスクレイピングすることができます!
電子ジャーナルなどについてはスクレイピングが禁止されていることがあります。検出システムが導入されていることもあるので、このページの内容を参考にする時は、サイトのルールを確認しておいてください!
サイト全体を保存したいとき
サイト全体をローカルに保存しておきたい場合は、次のコマンドでOKです。
$ wget -r --continue --wait=10 --random-wait -kKp -np --tries=1 --no-verbose --no-iri [URL]
このコマンドをコピペして、[URL]のところにダウンロードしたいサイトのURLを指定すれば、サイト全体をローカルにダウンロードすることができます。
たとえば、 https://google.com をまるごとアーカイブしたいなら、以下のようになります。
$ wget -r --continue --wait=10 --random-wait -kKp -np --tries=1 --no-verbose --no-iri https://google.com
この方法をつかうと、ディレクトリ構成を含め、サーバーのファイルをそのままローカルに保存することができます。長年更新されておらず、今にも消えてしまいまそうなサイトでもローカルにまるごと保存しておくことができます。
ダウンロードしたファイルはブラウザで閲覧することができます。ダウンロード時にリンクを相対リンクに変換するようにしているため、ローカルで閲覧時もリンクが有効となります。もちろん、画像ファイルなどの付属ファイルも同時にダウンロードしてくれます。
オプションの解説
上で示したコマンドのオプションについて解説していきます。各オプションの意味は次の通りです。
- k:保存するときに相対リンクに変換する(ダウンロードしたファイルをブラウザで見たときにリンクが動作するようにする)
- K:相対リンクに変換時、変換前のファイルも保存する(kオプションとともに使う。相対リンク変換前のオリジナルファイルも保存してくれる。オリジナルファイルはファイル名に.origが付与されて別に保存される。)
- np:親を辿らない(hoge.com/1をスクレイピングするなら、/1の中だけを保存するようにする。スクレイピングしたページに親ページへのリンクが含まれていた場合でもhoge.comに上がらないようにする.)※サイトのディレクトリ構成によっては、このオプションを付けるとスクレイピング漏れが起こるので注意。わからないときは外したほうがよい。
- tries:エラー発生時のリトライ回数
- wait:1回のアクセスにつき待機する秒数(waitオプションは1ファイルごとに適用される。例えば、同じページに複数枚の画像があった場合、1枚ダウンロードするごとにwaitオプションで指定した時間待機することになる。)
- random-wait:待機する秒数に乱数をかける※毎回待機する時間が変わるので、人が操作している感じにできる
- r:再帰的にダウンロード(リンクをたどってすべてのページを保存)
- –no-iri : URLにチルダが入っているときの対策。URLにチルダ(~)が入っていると、ファイル名が文字化けしてしまうが、このオプションをつけておくと大丈夫。
- continue:すでにダウンロードが一部行われている場合、続きから行う。※このオプションをつけておくと、途中でやめてもそこから再開できる。しかし、スクレイピングにかかる時間は初めからやるのと同じなので注意→「もろもろ」の章を参照のこと
- –no-verbose:詳細を表示しない。※テスト時は外しておくことを推奨。ログが表示されるので、外しておいたほうがテストしやすい。
もろもろ(注意点など)
あらかじめ知っておいてほしいwgetコマンドの仕様について書いておきます。wgetでスクレイピングする前に知っておくと役に立つかも。
- サイト全体のスクレイピングは十分テストして、一発勝負で行う必要がある
- 「continueオプションをつけてもると途中から再開できる」とドキュメントにはあるが、continueオプションを付けた場合もダウンロードは最初から行われる。すでにダウンロードされていたら、上書きしないで飛ばすだけなので、中断すると最初からやるのと同じ時間がかかる!テストしてOKなら、一発勝負で最後までやるのがおすすめ。
- フォルダは自動的に作成してくれる。カレントディレクトリにURLのディレクトリが自動的につくられて、その下にURLに従ってフォルダが自動作成される。
ユーザーエージェントを指定するには?
ユーザーエージェントとは、何のブラウザ・ツールでWebサイトにアクセスしているかを示すデータです。サーバー管理者は、ユーザーエージェントを解析することで、何のブラウザ・ツールを使ってアクセスしてきているのかを推定することができます。wgetを使ってアクセスすると、wgetのユーザーエージェントが通知され、wgetを使ってスクレイピングしたことが分かってしまいます。
別にスクレイピング自体は悪いことではないので隠す必要はないのですが、実際にスクレイピングする際は一応標準的なユーザーエージェントを設定しておきたいものです。wgetはユーザーエージェントの指定してスクレイピングすることもできます。
ユーザーエージェントを指定するには、–user-agentオプションをつけます。
--user-agent="任意のユーザーエージェント"
Chromeからアクセスしているものとする場合は、次のようになります。
--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
これをwget実行時のオプションに追加してください。
まとめ
今回紹介した方法(wgetコマンドを使った方法)を使うと、Seleniumなどのツールを使わなくても、かんたんにWebサイトを保存しておくことができます。SeleniumやPythonでプログラミングしなくても、コマンド一発で消えそうなWebサイトなどをアーカイブできます。
一応注意しておくと、SPA(シングルページアプリケーション)などを使用した最新のWebサイトについては、wgetではスクレイピングできないことがあります。こういった場合はSeleniumを使う必要があります。ただし、昔からあるような静的ファイルで構成されているWebサイトやサーバーサイドレンダリングされているサイトであれば、wgetで十分です。個人使用かつサイトのルールに違反しない程度に活用してみてもらえればと思います。
コメント