我需要下载从此网页链接的所有 PDF 文件https://www.in.tum.de/i07/lehre/ss22/theo/。
到目前为止我所尝试的一切要么没有获取文件,要么下载了全部的递归地访问网站。
然而,我只对此页面(而非网站)直接链接的 PDF 感兴趣。
谢谢。
答案1
您可以使用wget
( ) 和--no-parent
( ) 选项来控制该选项将镜像站点的多少内容。( ) 和( )选项还将阻止 wget 复制远程目录结构。
-np
--level=depth
-l
-r
--no-host-directories
-nH
--no-directories
-nd
(当选项以完整形式编写时,双连字符位于选项前面,而当选项以缩写形式编写时,单连字符位于选项前面 --no-parent 是 -np)
例如这样的东西:
wget -r -l 1 -nH -nd -np --ignore-case -A '*.pdf' https://www.in.tum.de/i07/lehre/ss22/theo/
默认情况下,这会将 .pdf 文件保存在当前目录中。您可以使用该-P
选项指定不同的输出目录。
wget
它非常灵活,并且有很多选项 - 太多了,以至于当您第一次阅读它时,手册页可能会让人不知所措,但绝对值得付出一些努力来阅读和尝试。
答案2
wget
您可以使用或curl
下载它从网页中提取 PDF 文件列表,并xmlstarlet
解析生成的 HTML/XML:
curl https://www.in.tum.de/i07/lehre/ss22/theo/ |
xmlstarlet format -H index.html 2>/dev/null |
xmlstarlet select -t -m '//a[contains(@href,"pdf")]' -v '@href' -n
第一个xmlstarlet
将 HTML 转换为 XML。第二个找到所有a
元素并提取href
包含 的每个属性值pdf
。
从那里可以直接下载每个提取的链接。将前一个块的输出传送到循环中
while IFS= read -r url
do
file="${url%\?*}" # Strip trailing ? parameters
file="${file##*/}" # Strip leading URL path
printf "Saving %s as %s\n" "$url" "$file" # Report action
curl "$url" >"$file"
done
答案3
更广泛地说,您可以使用 wget 从网页下载所有 PDF:
wget -r -l1 -H -t1 -nd -N -np -A.pdf -erobots=off --wait=2 --random-wait --limit-rate=20k [URL]
- -r:递归下载。
- -l1:仅一层深(即仅从此页面直接链接的文件)。
- -H:跨主机(跟随到其他主机的链接)。
- -t1:重试次数为1次。
- -nd:不创建目录结构,只下载所有文件到当前目录。
- -N:打开时间戳。
- -np:不跟踪父目录的链接。
- -A.pdf:仅接受以 .pdf 结尾的文件。
- -erobots=off:忽略 robots.txt 文件(谨慎使用,尊重网站的条款和条件)。
- --wait=2:每次检索之间等待 2 秒。
- --random-wait:从 0.5 到 1.5 等待 * --wait 检索之间的秒数。
- --limit-rate=20k:将下载速率限制为每秒 20 KB。
此参数将避免“429:太多请求”错误。