如何用Python从公开AWS S3下载文件?遇权限及SSL问题求助
解决方案
1. 修复boto3匿名访问配置
你之前的代码错误在于创建s3_client时未应用匿名访问配置,正确写法是在创建客户端时指定config参数:
import boto3 from botocore import UNSIGNED from botocore.config import Config # 创建匿名S3客户端 s3_client = boto3.client( 's3', config=Config(signature_version=UNSIGNED) ) # 下载目标文件 s3_client.download_file( 'oedi-data-lake', 'nrel-pds-building-stock/end-use-load-profiles-for-us-building-stock/2022/resstock_tmy3_release_1/building_energy_models/upgrade=10/bldg0000001-up10.zip', 'bldg1.zip' )
2. 处理SSLCertVerificationError
这个错误大概率和公司网络安全策略相关,比如内部代理、自定义SSL证书限制,可尝试以下解决方式:
方式一:临时跳过SSL验证(仅测试用,不推荐生产环境)
在boto3客户端或requests请求中添加verify=False参数:
# boto3示例 s3_client = boto3.client( 's3', config=Config(signature_version=UNSIGNED), verify=False ) # requests示例 import requests url = 'https://oedi-data-lake.s3.amazonaws.com/nrel-pds-building-stock/end-use-load-profiles-for-us-building-stock/2022/resstock_tmy3_release_1/building_energy_models/upgrade=10/bldg0000001-up10.zip' r = requests.get(url, verify=False) with open('bldg1.zip', 'wb') as f: f.write(r.content)
方式二:配置公司根证书
若公司使用自定义SSL证书,将证书文件路径传入verify参数:
# boto3示例 s3_client = boto3.client( 's3', config=Config(signature_version=UNSIGNED), verify='/path/to/company-root-cert.pem' ) # requests示例 r = requests.get(url, verify='/path/to/company-root-cert.pem')
方式三:配置公司代理
若需通过内部代理访问外部网络,在工具中设置代理信息:
# boto3代理配置 proxy_config = Config( signature_version=UNSIGNED, proxies={ 'http': 'http://your-proxy:port', 'https': 'https://your-proxy:port' } ) s3_client = boto3.client('s3', config=proxy_config) # requests代理配置 proxies = { 'http': 'http://your-proxy:port', 'https': 'https://your-proxy:port' } r = requests.get(url, proxies=proxies)
总结
- 匿名访问公开S3桶必须在创建客户端时指定
Config(signature_version=UNSIGNED) - SSL验证错误优先考虑配置公司证书或代理,跳过验证仅作为临时测试方案
内容的提问来源于stack exchange,提问作者Cu Buffalo
相关产品推荐
相关产品推荐

