如何优化wget下载脚本

如何优化wget下载脚本

网站内容

<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

我认为你不能。毕竟,使用-r递归下载选项基本上要求 wget 寻找链接(按-l级别),而链接只能在 html 文件中找到。因此 wget 需要下载并解析 html 文件,寻找更多 html 文件和 mp3 文件的链接。

如果您已经创建了链接列表,为什么不直接fgrep ".mp3"创建一个仅包含 mp3 文件的新列表,并将其用作 wget 的 link_source_file 呢?由于 wget 不会下载任何 html 文件,因此它不会找到更多链接,因此您-r -l也可以删除 以及可能的其他一些选项 - 只需保留-i(和-A,尽管列表已经只包含 mp3 文件)。使用该-x选项强制创建文件层次结构,即使没有-r.

简而言之,如果你想递归地遍历一个站点,你必须允许 wget 下载并解析 html 文件,即使它不保留它们。


另一种方法是使用 wget 来下载几个级别的 html 文件。然后手动从这些文件中获取链接,并创建一个包含您找到的所有 mp3 文件的列表(lynx、sed 和 fgrep 对此会有很大帮助)。或者,如果您了解网站的组织情况,请以其他方式生成您想要的文件列表(例如,使用 shellscript 创建一个包含以下行的列表:

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 文件的任何相关链接都将转换为完整链接。因此,您只有像上面发布的文件那样带有一个或多个 MP3 文件链接的文件。

然后你可以这样做:

(for f in *
 do
     grep -P --only-matching '(?<=href=")[^ "]*\.mp3' foo.html "$f"
     # rm "$f"
 done) | xargs wget

如果要删除下载的非 mp3 文件,请省略前面#的。rm

如果例如主机在引荐来源网址丢失或错误时拒绝下载,则这仍然可能会失败。

相关内容