如何使用Curl并发下载URL含可变参数的多个文件?
该需求可以实现,你可以通过控制curl进程后台并行运行的方式大幅缩短总下载耗时,以下是两种常用的实现方案:
方案一:原生Bash实现(无需额外依赖)
通过后台标记&让curl在后台运行,同时增加并发数控制避免一次性启动过多进程:
# 最大并发数,可根据实际情况调整 MAX_CONCURRENT=10 counter=0 for store in {4..80} do for page in {1..200} do curl 'https://website.com/shop.php?store_id='$store'&page='$page'&PHPSESSID=sessionID' -O & ((counter++)) # 达到并发上限时等待当前所有后台进程跑完再继续启动新进程 if (( counter >= MAX_CONCURRENT )); then wait counter=0 fi done done # 等待最后一批不足并发上限的进程全部运行结束 wait
该方案无需安装额外工具,缺点是按批次执行,一批进程全部跑完才会启动下一批,并发利用率相对较低。
方案二:xargs实现更高效的并发控制
使用xargs的并行参数实现进程动态补位,只要有进程结束就自动启动新的下载进程,并发利用率更高:
# 最大并发数,可根据实际情况调整 MAX_CONCURRENT=10 for store in {4..80}; do for page in {1..200}; do echo "https://website.com/shop.php?store_id=${store}&page=${page}&PHPSESSID=sessionID" done done | xargs -n 1 -P ${MAX_CONCURRENT} curl -O
参数说明:-n 1代表每次给curl传递1个URL参数,-P参数指定最大并行进程数。
注意事项
- 请根据自身网络条件和目标站点的承受能力合理调整最大并发数,数值过高可能触发站点反爬规则导致IP被封禁
- 可在curl命令中添加
-s参数关闭进度输出,避免多个后台进程的输出打乱终端展示
内容的提问来源于stack exchange,提问作者Datenkralle
相关产品推荐
相关产品推荐

