TransWikia.com

wgetにて指定したディレクトリ下のファイルのみをダウンロードしたい

スタック・オーバーフロー 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_bsection_cへのリンクが含まれている とします。

実行したこと

そこで以下のwgetコマンドを実行しました。

wget -p -E -nH -np -k -r -l1 https://files.example/works/section_a

実行結果

しかし結果は期待していたものではなく、section_aのみならず、同階層section_bsection_cのファイルもダウンロードされてしまいます。
親階層のファイルについては、期待通り取得はされておりません。

疑問

  • なぜ-npオプションを付けた状態でhttps://files.example/works/section_aを指定しているにもかかわらず、同階層のディレクトリのファイルがダウンロードされてしまうのでしょうか?

  • またsection_aのファイルのみをダウンロードする方法は存在しますか?

追記

URLの末尾に/を追加

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.

なお末尾にスラッシュを付けた状態でブラウザでアクセスを試みた場合、ページが見つからないという状態となっております。

2 Answers

なぜ-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でno-parentが効かない

ところがこれが期待に外れて親の階層までとりにいく。なぜだーとしらべることしばし。
最後に / をつけなきゃダメよとのこと。

# wget --recursive --no-remove-listing --no-parent http://www.example.com/foo/baa/

Answered by cubick on January 23, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP