web-dev-qa-db-ja.com

一度に複数のURLをダウンロードする

URLのリストをダウンロードする方法としてwget -iを知っています。唯一の問題は、いくつかの異なるPOSTデータをそれぞれに渡す必要があることです。これは、wget --post-data=を使用する単一のURLでは機能しますが、リストでは機能しません。

私はどんなCLIダウンローダーでも、あるいはJSやPythonでさえもオープンです。ただし、ダウンロードごとにプログレスバーを表示するか、DLが終了するたびに更新されるログファイルを取得するか、DLが終了するタイミングを知る他の方法があります。

7
themirror

すでにURLのリストがある場合は、POSTデータをそのリストに追加するだけです。

www.example.com    postdata1
www.foo.com
www.bar.com       second_post_data

次に、-iを使用する代わりに、bashループでファイルを読み取り、データをwgetに渡します。

while read url post; do wget --post-data="$post" $url; done < list.txt

複数のファイルが同時にダウンロードされるようにそれらを並行して実行するには、&ではなく;を使用します。ただし、これにより、URLごとに個別のwgetプロセスが起動されます。

while read url post; do wget --post-data="$post" $url & done < list.txt

このタイプのものを起動するために使用する1つのトリックは、現在実行中の数を追跡し、数値がしきい値(10など)を下回る場合にのみ次の1つを実行することです。

while read url post; do 
 while [[ "$(pgrep -fc wget)" -gt 9 && $c -gt 10 ]]; do sleep 1; done; 
 ((c++));  
 echo "Launching $url ($c)"; 
 wget --post-data="$post" $url >/dev/null 2>&1 && echo "$c finsihed" & 
done < list.txt

これにより、最初の10個のURLが起動し、1つのURLが終了するのを待って次のURLを起動します。

3
terdon

次の形式のように、区切りファイルCSVを定義できます(例)。

URL1;POSTDATA1
URL2;POSTDATA2
...

awkコマンドを使用して解析します。

awk -F\; '{print "wget -i "$1" --post-data="$2}' your_CSV_file
2
Slyx