web-dev-qa-db-ja.com

リダイレクト後の再帰的ダウンロード

私の目標:

  1. 関連するすべてのリンクがサーバースクリプト(*/download.php?standard=yes&file=*.Zip)によって行われるリダイレクトであるページにすべての* .Zipファイルをダウンロードしたいと思います。
  2. この場合、サーバーによって指定された名前は常に「download.Zip」であるため、元のリンクを使用してファイルに名前を付けたいと思います。

具体的には、ここからOsmAndマップをダウンロードしたいと思います: http://download.osmand.net/rawindexes/

どうすればいいのですか?

私が試したこと:

wgetを使用して、MAPS.MEのマップと同様のことを行うことができます。

wget -rl1 --accept="mwm" http://direct.mapswithme.com/direct/latest/

ただし、この場合、リンクは直接であり、ファイル名に問題はありませんでした。

curl -Lも使用しようとしましたが、再帰がなく、そのページで使用されている種類のリダイレクトでは機能しないようです。

3
256shadesofgrey

Wgetは正常に機能しますが、エスケープされていないため、URLを引用符で囲む必要があります。

つまり.

wget 'http://download.osmand.net/download.php?standard=yes&file=Afghanistan_asia_2.obf.Zip' -O Afghanistan_asia_2.obf.Zip

-Oオプションは、出力名を制御します。ファイル名のリストがあれば、それを実行するシェルスクリプトを作成するのはかなり簡単なはずです。

編集:ページをダウンロードしてファイルパターンの正規表現検索を実行すると、ファイル名を取得できます。

wget -nv 'http://download.osmand.net/rawindexes/' -O - | grep -oE "file=[A-Za-z0-9_]*.obf.Zip" | cut -c6-

これをxargsと組み合わせて、wgetに直接パイプして各ファイルをダウンロードすることができます。

xargs -I{} wget 'http://download.osmand.net/download.php?standard=yes&file={}' -O {}

または、完全な1行のコマンド(Cygwinで機能し、他の* nixでは引用符とxargsを操作する必要がある場合があります):

wget -nv 'http://download.osmand.net/rawindexes/' -O - | grep -oE "file=[A-Za-z0-9_]*.obf.Zip" | cut -c6- | xargs -I{} wget 'http://download.osmand.net/download.php?standard=yes&file={}' -O {}
0
nijave

一部のファイル名には「-」が含まれています。したがって、ファイルのリストを取得するためのスクリプトは、1文字で変更する必要があります。これは私のために働きます:

wget -nv 'http://download.osmand.net/rawindexes/' -O - | grep -oE "file=[A-Za-z0-9_-]*.obf.Zip" | cut -c6-
1
Julian Stoev