このWebページにリンクされているすべての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 is -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
ダウンロードして、Webページから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に変換します。 2番目はすべての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を使用してWebページからすべてのPDFをダウンロードできます。
wget -r -l1 -H -t1 -nd -N -np -A.pdf -erobots=off --wait=2 --random-wait --limit-rate=20k [URL]
- -r:再帰的ダウンロード。
- -l1:1レベルの深さのみ(つまり、このページから直接リンクされたファイルのみ)
- -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: ダウンロード速度を毎秒20KBに制限します。
このパラメーターは、「429:要求が多すぎます」エラーを防止します。