如何使用 wget 下载从单个页面链接的所有 PDF 文件

如何使用 wget 下载从单个页面链接的所有 PDF 文件

我需要下载从此网页链接的所有 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:太多请求”错误。

相关内容