
ウェブサイトのコンテンツ
<html>
<body>
<a href="http://www.sagar.com/" title="sagar">Sagar</a>
<a href="http://www.sagarcom/1/" title="sagar1">Sagar Link1</a>
<a href="http://www.sagar.com/2/song.mp3">Download this</a>
</body>
</html>
link_source_file.txt
上記を含むURL
## Below wget command
wget -r -l1 -H -t1 -nd -N -np -A.mp3 -erobots=off -i link_source_file.txt
-Aで述べた特定の種類のファイルをダウンロードしたいと思います。ここにいるmp3
。上記のwgetコマンドはリンクの深さに従います-t1
。
最初のリンクをたどってファイルをhttp://www.sagar.com/
ダウンロードします。index.html
その後、ファイル形式がないことを発見して.mp3
削除しました。index.html
私はwgetが拡張子を持つリンクだけに従い、*.mp3
他のリンクに従わないことを望みます。この要件を満たすようにコマンドをどのように調整できますか?
答え1
私の考えでは、あなたはできないと思います。最終的に再帰ダウンロードオプションを使用するには、デフォルトでwgetがhtmlファイルでのみ見つけることができる-r
リンク(レベル別)を見つける必要があります。-l
したがって、wgetはより多くのhtmlファイルとmp3ファイルへのリンクを見つけるためにhtmlファイルをダウンロードして解析する必要があります。
すでに接続リストを作成している場合は、fgrep ".mp3"
mp3ファイルのみを含む新しいリストを作成し、それをwgetのlink_source_fileとして使用するのはどうでしょうか? wgetはhtmlファイルをダウンロードしないため、リンクが見つからないため削除することも、-r -l
他のオプションもあります。ただ維持します-i
(-A
リストにはすでにmp3ファイルのみが含まれていますが)。-x
ファイル階層がなくてもファイル階層を強制するには、このオプションを使用します-r
。
つまり、サイトを再帰的に閲覧するには、wgetがhtmlファイルを保存しなくてもhtmlファイルをダウンロードして解析できるようにする必要があります。
別の方法は、wgetを使用して複数レベルのhtmlファイルをダウンロードすることです。その後、手動でこのファイルからリンクを取得し、見つかったすべてのmp3ファイルのリストを作成します(lynx、sed、およびfgrepがこれに役立つでしょう)。または、サイトがどのように構成されているかを知っている場合は、別の方法で目的のファイルのリストを生成します(たとえば、シェルスクリプトを使用して次の行を含むリストを生成します。
http://www.sagar.com/1/song.mp3
http://www.sagar.com/2/song.mp3
http://www.sagar.com/3/song.mp3
http://www.sagar.com/100/song.mp3
答え2
grepを使用した手動方法。
空のディレクトリから始めて、リスト内のすべてのHTMLファイルを非再帰的にダウンロードします。--convert-links
MP3ファイルへの関連リンクをフルリンクに変換するオプションが追加されました。したがって、1つ以上のMP3ファイルへのリンクを含む上記に公開されたものと同じファイルしかありません。
これにより、次のことができます。
(for f in *
do
grep -P --only-matching '(?<=href=")[^ "]*\.mp3' foo.html "$f"
# rm "$f"
done) | xargs wget
ダウンロードしたmp3以外のファイルを削除するには、古いファイルを省略してください#
。rm
たとえば、リファラーが存在しないか間違っている場合、ホストがダウンロードを拒否しても失敗する可能性があります。