スタック・オーバーフロー Asked by tan on January 23, 2021
ダウンロードを行いたいサイトは以下のような構成です。
https://files.example/works/section_a
https://files.example/works/section_b
https://files.example/works/section_c
...
これらの中で、section_a
下のファイルのみをダウンロードしたいとします。
しかしsection_a
内のページには section_b
とsection_c
へのリンクが含まれている とします。
そこで以下のwgetコマンドを実行しました。
wget -p -E -nH -np -k -r -l1 https://files.example/works/section_a
しかし結果は期待していたものではなく、section_a
のみならず、同階層のsection_b
、section_c
のファイルもダウンロードされてしまいます。
親階層のファイルについては、期待通り取得はされておりません。
なぜ-np
オプションを付けた状態でhttps://files.example/works/section_a
を指定しているにもかかわらず、同階層のディレクトリのファイルがダウンロードされてしまうのでしょうか?
またsection_a
のファイルのみをダウンロードする方法は存在しますか?
wget -p -E -nH -np -k -r -l1 https://files.example/works/section_a/
URL末尾に/
を追加してwgetを実行した結果、404 Not Found
となってしまいました。
...
HTTP request sent, awaiting response... 404 Not Found
2021-01-05 19:16:16 ERROR 404: Not Found.
なお末尾にスラッシュを付けた状態でブラウザでアクセスを試みた場合、ページが見つからないという状態となっております。
なぜ-npオプションを付けた状態でhttps://files.example/works/section_aを指定しているにもかかわらず、同階層のディレクトリのファイルがダウンロードされてしまうのでしょうか?
-np
は --no-parent
ですから、親階層を取得しないという意味ですよね。
同階層は取得対象になります。
またsection_aのファイルのみをダウンロードする方法は存在しますか?
section_b
,section_c
を取得しているのは-r
で再帰取得を指定しているからなので、以下のように-r -l1
を付けなければいいのではないでしょうか。
wget -p -E -nH -np -k https://files.example/works/section_a
section_a
はファイルかと思っていましたが、ディレクトリなのですね。
https://files.example/works/section_a
というURLが有った場合、ベースとなるディレクトリは/works/
であり、section_a
はファイルだと解釈されます。
section~a
がディレクトリだった場合、通常Webサーバはクライアントにディレクトリで有る事を伝える為にhttps://files.example/works/section_a/
へリダイレクトするメッセージを返します。
https://files.example/works/section_a/
ならばベースディレクトリは/works/section_a/
となるので、-npオプションは期待通り働くでしょう。
しかし、wgetでhttps://files.example/works/section_a/
を指定すると Not Found となるのですね。
リダイレクト先としてファイルを直接返してきているのかもしれません。
wgetを実行した時に以下のようにリダイレクトのメッセージが出ていませんか?
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://files.example/works/section_a/index.html [following]
リダイレクト先としてsection_a
の中のファイルを返してきていた場合はwgetでそのURLを指定すればいいでしょう。
問題なのはsection_a
の外のファイルを返してきていた場合や、リダイレクトされていなかった場合ですね。その場合は以下のように--accept-regex
オプションで/works/section_a
を指定してみて下さい。
wget -p -E -nH -np -k -r -l1 --accept-regex '/works/section_a' https://files.example/works/section_a
ただし、section_a
の下のhtmlを表示するのに必要なファイル(画像等)がsection_a
の外側に有った場合は、上記だとそれらのファイルの取得が出来ません。
その場合は以下のように--reject-regex
オプションでsection_b
等を除外する方がいいかもしれません。
wget -p -E -nH -np -k -r -l1 --reject-regex '/works/section_[b-z]' https://files.example/works/section_a
Answered by いわもと こういち on January 23, 2021
指定した URL がディレクトリであるなら、末尾に /
を付けて 実行してみてください。
ところがこれが期待に外れて親の階層までとりにいく。なぜだーとしらべることしばし。
最後に/
をつけなきゃダメよとのこと。# wget --recursive --no-remove-listing --no-parent http://www.example.com/foo/baa/
Answered by cubick on January 23, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP