因此wget
具有递归下载文件的能力,但它一次只下载一个文件。
我想传递一个目录 URL,并为它在递归中遇到的每个 URL 生成一个下载过程。
我想到的一种方法是以某种方式wget
打印出它遇到的 URL,然后将这些 URL 输入到单独的实例中wget
(通过wget URL_1 &
等wget URL_2 &
)。
有任何想法吗?
答案1
我一直在思考这个问题,但我不相信 wget 是完成这项工作的最佳工具。
以下是我在 2022 年将如何使用类似的工具来做到这一点小狗是专门为解析 HTML 而设计的(在 pup 的例子中,CSS 选择器):
wget -q -O- https://ubuntu.com/download/alternative-downloads \
| pup 'a[href$=".torrent"] attr{href}' \
| aria2c -d ~/Downloads -i -
也可以看看
-
-e
/选项--extract
使用XPath 选择器默认情况下;支持带有--css '<selector>'
或 的CSS 选择器--extract 'css("<selector>")'
curl
可以直接获取互联网资源——不过比我的机器上慢一点- 非常宽容的解析器;几乎从未见过它抱怨,即使对于格式错误的 HTML
- 例子:
xidel https://www.videlibri.de/xidel.html \ -e '//a[ends-with(@href,"/download")]/@href' # faster, for some reason; don't forget the '-' (read from stdin)! curl -q https://www.videlibri.de/xidel.html \ | xidel -e '//a[ends-with(@href,"/download")]/@href' - # same as above, using CSS selectors + XPath for the attribute curl -q https://www.videlibri.de/xidel.html \ | xidel -e 'css("a[href$=/download]")/@href' -
-
- 使用 XPath 选择器
- 必须有格式良好的 XML/XHTML 作为输入
- 管道通过
xmlstarlet fo -H -R
(重新佛rmat,期望输入为HTML,尝试一下右错误后恢复)应该可以修复大多数网站
- 管道通过
- 例子:
# NB: my version of xmlstarlet doesn't support XPath 'ends-with' curl -s https://ubuntu.com/download/alternative-downloads \ | xmlstarlet fo -H -R 2>/dev/null \ | xmlstarlet sel -t -v '//a[contains(@href, ".torrent")]/@href' -n
答案2
与它一起使用grep
:
wget url -rqO - | grep -oE '[a-z]+://[^[:space:]"]+'
答案3
解决此问题的一种方法是收集纯文本文件中的所有链接并执行以下操作:-
while read line; do
echo "Downloading ${line}"
wget $line &
done < $1
将此文件另存为脚本文件并使其可执行并运行它
$ ./script.sh
永久解决此问题的更好方法是将 wget 重写为本质上并行的。
答案4
就我而言,它的工作原理是链接两个wget
:
$ wget -O - -o /dev/null http://site.to.get.urls.from | grep -o 'some_regex' | wget -i -
第一个wget
将生成带有文件的 URL 列表,该列表用作第二个的输入“文件” wget
。
请注意,这是一个简化的版本向您展示其背后的技术。grep
和第二个命令之间的管道wget
实际上可能与更多的管道命令(例如sed
,awk
或 )组合在一起cut
(特别是如果 HTML 源代码比平常更复杂,因此解析它更困难)。
这写着:始终确保您wget
首先调用内部独立函数来验证stdout
您的正则表达式是否正常工作。