批量下载
Python3 批量下载文件中给定的 urls
假如需要下载的 urls 存在于给定的文件中(每行一个 url),本示例演示批量并发下载,假设 urls 存在于文件 urls.txt
中
import concurrent.futures import requests
def download_image(url): try: response = requests.get(url) response.raise_for_status() print(f"下载完成: {url}") except requests.exceptions.RequestException as e: print(f"下载失败: {url}, 错误: {e}")
with open("urls.txt", "r") as file: img_urls = file.read().splitlines()
max_concurrent_threads = 10 with concurrent.futures.ThreadPoolExecutor(max_concurrent_threads) as executor: executor.map(download_image, img_urls)
print("所有图片下载完成")
|
shell 批量下载文件中给定的 urls
假如需要下载的 urls 存在于给定的文件中(每行一个 url),本示例演示批量并发下载,假设 urls 存在于文件 urls.txt
中
本示例中的 urls.txt
内容示例如下:
urls.txthttp://cdn-log-customer-bj4.obs.cn-north-4.myhuaweicloud.com:80/oversea/20241202/09/2024120209-domain-ov.gz?AccessKeyId=WWHEIFLWKIMHHDKIPRWLJJ40CFS&Expires=1733208754&response-content-disposition=attachment%3Bfilename%3D%222024120209-domain-ov.gz%22&Signature=bGHy1CPncaXJladgG9NdIRwASsdgSIvs%3D http://cdn-log-customer-bj4.obs.cn-north-4.myhuaweicloud.com:80/mainland/20241202/09/2024120209-domain-cn.gz?AccessKeyId=WWHEIFLWKIMHHDKIPRWLJJ40CFS&Expires=1733208754&response-content-disposition=attachment%3Bfilename%3D%222024120209-domain-cn.gz%22&Signature=bGHy1CPncaXJladgG9NdIRwASsdgSIvs%3D http://cdn-log-customer-bj4.obs.cn-north-4.myhuaweicloud.com:80/oversea/20241202/08/2024120208-domain-ov.gz?AccessKeyId=WWHEIFLWKIMHHDKIPRWLJJ40CFS&Expires=1733208754&response-content-disposition=attachment%3Bfilename%3D%222024120208-domain-ov.gz%22&Signature=ZT64%bGHy1CPncaXJladgG9NdIRwASsdgSIvs%3D http://cdn-log-customer-bj4.obs.cn-north-4.myhuaweicloud.com:80/mainland/20241202/08/2024120208-domain-cn.gz?AccessKeyId=WWHEIFLWKIMHHDKIPRWLJJ40CFS&Expires=1733208754&response-content-disposition=attachment%3Bfilename%3D%222024120208-domain-cn.gz%22&Signature=bGHy1CPncaXJladgG9NdIRwASsdgSIvs%3D
|
简单的 串行下载命令 如下,从 url 中取出文件名作为下载文件名:
for i in `cat urls.txt`; do fn=`echo $i | cut -d'?' -f1 | cut -d'/' -f7` ; curl -o $fn "$i"; done
|
使用以上命令,如果下载内容太多,会比较慢,以下代码示例使用 xargs
命令批量下载,xargs
会自动分配任务,确保多个下载任务同时运行 。:
cat log-url | xargs -P 10 -I {} sh -c 'fn=$(echo "{}" | cut -d"?" -f1 | cut -d"/" -f7); curl -o $fn "{}"'
|
xargs
参数说明:
-P 10
: 指定并发进程数为 10,可以根据系统资源调整。
-I {}
: 替换(Pipe)输入中的每行(URL) 为 {}
。
如果无需提取文件名,可以 使用 wget
命令的并行下载功能
wget -i urls.txt -P output-dir -nc --max-threads=10
|
参数说明如下:
-i urls.txt
: 从文件中读取下载 URL。
-P output-dir
: 将下载文件存储到 output-dir
。
--max-threads=10
: 设置并发线程数为 10。
-nc
: 跳过已下载的文件,避免重复下载。