常用小脚本收集

批量下载

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() # 检查是否有 HTTP 错误
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()

# 使用 ThreadPoolExecutor 来限制并发线程数量为 10
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.txt
http://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 : 跳过已下载的文件,避免重复下载。