如何从Python数组中批量下载多个URL 已解析得到URL列表如何编写后续循环逻辑
Python 批量URL资源下载实现
以下是承接你现有代码的完整可运行实现,支持异常捕获、重复下载跳过、大文件适配:
import requests from bs4 import BeautifulSoup as bs import os # 原有URL解析逻辑 r = requests.get('https://earth-info.nga.mil/index.php?dir=coordsys&action=gars-20x20-dloads') soup = bs(r.content, 'html.parser') files = ['https://earth-info.nga.mil/' + i['href'] for i in soup.select('area')] # 本地存储目录配置 save_dir = './nga_resource_downloads' os.makedirs(save_dir, exist_ok=True) # 批量下载循环 for download_url in files: # 从URL中提取文件名作为本地存储文件名 file_name = download_url.split('/')[-1] local_save_path = os.path.join(save_dir, file_name) # 跳过已下载的文件,避免重复请求 if os.path.exists(local_save_path): print(f"已跳过: {file_name}") continue try: # stream=True开启流式下载,适合大文件降低内存占用 resp = requests.get(download_url, stream=True, timeout=30) # 遇到HTTP错误(404/500等)自动抛出异常 resp.raise_for_status() # 分块写入本地文件 with open(local_save_path, 'wb') as f: for chunk in resp.iter_content(chunk_size=8192): f.write(chunk) print(f"下载完成: {file_name}") except Exception as e: print(f"下载失败: {file_name},错误信息: {str(e)}")
关键逻辑说明
- 目录自动创建:
os.makedirs的exist_ok=True参数保证多次运行代码不会因目录已存在报错 - 重复下载过滤:本地已经存在的文件会直接跳过,无需重复发起请求
- 异常兼容:所有请求、写入环节的异常都会被捕获,单个文件下载失败不会中断整个批量任务
- 大文件适配:流式下载+8KB分块写入,就算是GB级资源也不会占满运行内存
- 状态输出:每个文件的下载状态都会实时打印,方便后续核对失败资源
补充说明:如果站点有反爬限制,可在
requests.get参数中添加headers伪装浏览器请求,也可以引入time.sleep设置请求间隔,避免触发频率限制。
内容的提问来源于stack exchange,提问作者Ismail Gaddipati
相关产品推荐
相关产品推荐

