我想生成數字串列并發出 http 請求并在 ubuntu 上使用 cURL 和 jq 保存結果。
我已經使用 FOR 回圈撰寫了單執行緒并且它可以作業,但我想將執行緒添加到我的腳本中以更快地作業。
for i in `seq 12345 12550 `; do echo $i ;curl -s -k -X $'GET' \
-H $'Host: example.com' -H $'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36' -H $'Accept: application/json, text/plain, */*' -H $'Accept-Encoding: gzip, deflate' -H $'Accept-Language: en-US,en;q=0.9,fa;q=0.8' -H $'Connection: close' \
$'https://example.com/pages/json/'$i'/list' | jq ".files[]"; done
如何向我的腳本添加執行緒或并行以加快我的行程?
我的目標是制作一個 bash 腳本,它從用戶那里接收數字范圍和執行緒數的引數,并通過請求的數字名稱將每個請求的結果保存到特定路徑。
$script.sh -numbers 12345-12550 -threads 100 -outpath ~/result/
uj5u.com熱心網友回復:
doit() {
i="$1"
echo $i
curl -s -k -X $'GET' \
-H $'Host: example.com' -H $'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36' -H $'Accept: application/json, text/plain, */*' -H $'Accept-Encoding: gzip, deflate' -H $'Accept-Language: en-US,en;q=0.9,fa;q=0.8' -H $'Connection: close' \
$'https://example.com/pages/json/'$i'/list' |
jq ".files[]"
}
export -f doit
seq 12345 12550 | parallel -j100 --results ~/result/{} doit
uj5u.com熱心網友回復:
如果curl --version說您有 7.66.0 或更高版本,那么您可以使用-Z/--parallel進行并行傳輸。--parallel-max <num>對同時傳輸的數量設定限制(默認限制為 50)。
但是要使用它,您需要在單個呼叫中指定目標 URL curl。一種方法是使用 curl 的 URL globbing(在 中描述man curl)。例如,要獲取從 1 到 100 的范圍:
curl 'https://example.com/pages/json/[1-100]/list'
也可以給出計步器(例如,[1-30:10]對于1、11、21)。即使沒有-Z,這也應該更有效,因為 curl 將能夠重用連接。它還允許使用#1在--output檔案名中具有特殊含義(這在 curl 手冊中進行了描述,并且會執行我認為您的意思save the result for each request to the specific path by requested number name)。
順便說一句,-H $'Connection: close'您可能更喜歡使用-H 'Connection: keep-alive'(而不是 )(在您發出多個請求時要求保持連接打開,并且$''參考用于處理 C 風格的反斜杠轉義,我認為您不想在這里這樣做)。
我的目標是...
$script.sh -numbers 12345-12550 -threads 100 -outpath ~/result/
這是數字和執行緒的想法(這里簡單地作為第一個和第二個位置引數給出 - 選項決議取決于您):
#! /bin/sh -
range=${1:?}
parallel=$2
url="https://example.com/pages/json/[$range]/list"
out='example_page_#1.json'
ua="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
curl -qfsS --compressed ${parallel: -Z --parallel-max "$parallel"} \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Accept-Language: en-US,en;q=0.9,fa;q=0.8' \
-H 'Connection: keep-alive' \
-A "$ua" -o "$out" "$url"
$ chmod x example
$ ./example 01-15 5
$ ls
example_page_01.json example_page_06.json example_page_11.json
example_page_02.json example_page_07.json example_page_12.json
example_page_03.json example_page_08.json example_page_13.json
example_page_04.json example_page_09.json example_page_14.json
example_page_05.json example_page_10.json example_page_15.json
這會將每次傳輸保存到其自己的example_page_N.json檔案(在當前目錄中)。之后您可以進行任何處理jq。或許:
for f in example_page_*.json
jq '.files[]' < "$f" > "files_$f"
done
我在評論中注意到您需要一個輸出檔案,其中每個結果的數量取決于是否.files[]包含“***”。根據 json 資料,您可能可以在單個管道中使用jq(但這與“多執行緒 cURL 請求?”不同)。
uj5u.com熱心網友回復:
最簡單的方法是獲取您擁有的腳本并使其接受輸入運行一次,然后創建另一個腳本,該腳本使用各種值呼叫該腳本。
例如:
腳本1.sh
echo "%1 Hello World" >> output.txt
腳本2.sh
for name in $namesList ;do
./Script1.sh $name &
done
wait
cat output.txt
Dave Hello World
Tom Hello World
...
注意:這更像是一種初學者方法,但您可以從那里呼叫諸如此類的函式并將其全部撰寫為一個腳本。
請參閱有關作業的檔案:https : //tldp.org/LDP/abs/html/x9644.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399808.html
