私の目標: Transport Fever 2モードセクションでリリースされた最新モードを取得するには、毎日スクリプトまたはコマンドを実行してください。 https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/
以下はモードの例です。ダウンロードできるファイルは下部にあります。 https://www.transportfever.net/filebase/index.php?entry/5107-%C3%B6bb-%C3%A4ra-valousek-%C3%B6bb-1012-%C3%B6bb-1014-%C3%B6bb -1163/
wgetを試しましたが、index.phpファイルのみをダウンロードできます(私はLinux初心者です)。
問題は、彼らがサードパーティのホストでファイルをホストしていることです。
私がどのように目標を達成できるかを知っている人はいますか? :)
よろしくお願いします!
ベストアンサー1
https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/最新のドキュメントへのリンクを提供します。ダウンロードサイトのhtmlドキュメントを使用し、出力をcurl
パイプしてダウンロードリンクを抽出し(次の簡単な方法を実行)、コマンドgrep
置換を使用してこのリンクを2番目のコマンドcurl
に渡すことができます。
curl -OJ \
$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -om1 '[^"]*entry-download/[^"]*')
これがあなたに学ぶ点があることを願っています。
grep
使用されたオプション:
-o
/--only-matching
パターンを含む行全体ではなく、一致するパターンのみを出力します。-m 1
/--max-count=1
一致する項目を含む最初の行以降の入力検索を停止します。一致するパターン::
[^"]*entry-download/[^"]*
ダウンロードリンクがすべて提供されているようですhref="https://www.transportfever.net/filebase/index.php?entry-download/<number><...>"
。したがって、上記のパターンマッチングは十分に見えます。二重引用符を除いたすべての文字が 0 個以上"
、その後にentry-download/
、その後に二重引用符を除いたすべての文字が 0 個以上出てきます。"
curl
使用されたオプション(最初のパス - 交換内):
-f
/--fail
一つを受け取ったら何も出力しない4/5xx
http返信- 要求が失敗し、grepに失敗したhtml文書を知らせたくありません。-s
/--silent
これは最初のパスなので、進行状況バーなどを見たくありません。
2番目のパスcurl
オプション - このダウンロードリンクはcontent-disposition
ヘッダーを使用してファイル名を通知します。
-O
/--remote-name
リモートファイルと同じ名前でファイルを保存します。-J
/ URLからファイル名を抽出する代わりに、サーバーが指定したコンテンツ処理ファイル名を使用するオプションを--remote-header-name
許可します。-O
実際にはいくつかのリンクがありますentry-download/
。リンクをすべてダウンロードするには、次のように2番目のオプションを削除して調整し-m1
ます。grep
curl
--remote-name-all
curl --remote-name-all -J \
$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -o '[^"]*entry-download/[^"]*')
ファイル競合の確認:
content-disposition
ヘッダーに記載されているファイル名を事前に知りたい場合は、追加の手順が必要です。カールを使用してhead
要求を送信できます。
# get first url from the page, storing it to
# the parameter 'url' so we can use it again later
url=$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -om1 '[^" ]*entry-download/[^" ]*')
# head request to determine filename
filename=$(curl -Is "$url" | grep -iom1 '^content-disposition:.*filename="[^"]*' | grep -o '[^"]*$')
# 'if' statement using the 'test' / '[' command as the condition
if test -e "$filename"; then
echo "$filename exists!"
else
# a file named $filename doesn't exit,
# so we'll download it
curl -o "$filename" "$url"
fi
- 以下は、ダウンロードを試みる前にクラッシュするファイルを確認する簡単な例です。
curl -J
既存のファイルを上書きしないので、必ずしも必要ではありませんが、おそらく"$filename"
そうではないかもしれません.zip
。"${filename%.zip}"
- 他のディレクトリやテキストファイルにファイルがあることを確認したいようです。
上記に基づいて抽出されたすべてのURLに対してentry-download/
これを行うには、次の手順を実行します。
# extract all urls, placing them in an array parameter 'urls'
urls=( $(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -o '[^" ]*entry-download/[^" ]*') )
# loop over extracted urls
for i in "${urls[@]}"; do
# do filename extraction for "$i"
# use filename to determine if you want to download "$i"
done