Linux

從網站下載文件(遊戲模組)

  • February 1, 2020

我的目標: 每天執行一個腳本或命令,以獲得在 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 的初學者)。

我認為問題在於,他們將文件託管在第三方託管商上。

有誰知道我如何實現我的目標?:)

提前致謝!

https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/提供最新文件的連結。可以使用 下載站點的 html 文件,通過curl管道輸出以提取下載連結(使用下面的簡單方式完成grep)並使用命令替換,將此連結傳遞給第二個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><...>"– 所以上面的模式匹配似乎就足夠了:除了雙引號之外的任何字元的零個或多個",然後是entry-download/,再後面是零個或多個除雙引號之外的任何字元"

curl使用的選項(第一次通過 - 在替換內):

  • -f/如果我們收到http 回复--fail,則不輸出任何內容- 請求失敗,我們不想 grep 告訴我們它失敗的 html 文件4/5xx
  • -s/--silent這是第一遍,我們不想看到進度條什麼的

第二遍curl選項——這些下載連結使用content-disposition標題來告訴我們文件名,所以:

  • -O/--remote-name使用與遠端文件相同的名稱保存文件
  • -J/--remote-header-name允許-O選擇使用伺服器指定的 Content-Disposition 文件名,而不是從 URL 中提取文件名

實際上有不止一個entry-download/連結——要下載所有連結,我們可以從第二個選項中刪除-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頭部描述的文件名,就需要一個額外的步驟。我們可以使用 curl 發送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}"- 在某個其他目錄,或者可能在某個文本文件中

在上述基礎上,如果您想對所有提取的entry-download/url 執行此操作:

# 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

引用自:https://unix.stackexchange.com/questions/565008