如何用Python下载含签名等参数的非简单PDF链接文件?
解决Azure Blob带SAS链接的Python下载问题
针对你遇到的带SAS参数的Azure Blob PDF链接无法用基础requests代码下载的问题,可以从以下几个方向调整代码:
1. 修复URL编码问题
你的URL包含大量URL转义字符(如%2B、%3D、%22),直接传入requests可能触发隐性二次编码,导致SAS参数失效。可以通过解码确保URL原样传递:
import requests from urllib.parse import unquote # 替换为你的完整Blob SAS链接 raw_url = "https://....blob.core.windows.net/../.../../signedefiles/.....pdf?sv=date&se=2023-11-17T16%3A35%3A35Z&sr=b&sp=r&rscc=no-store&rscd=attachment%3Bfilename%3D%22ABC+QRZ+8112+2022.pdf%22&rsct=application%2Fpdf&sig=ABCDEF%2GHIJK%2123%3D" # 解码后使用,避免二次编码破坏参数 url = unquote(raw_url) response = requests.get(url) # 先打印状态码排查问题:200为成功,403/404说明参数或URL有误 print(response.status_code) with open('sample.pdf', 'wb') as f: f.write(response.content)
2. 添加模拟请求头匹配Power Automate行为
Power Automate发起请求时会携带特定请求头,Azure Blob可能对请求头有隐性要求。尝试添加常见请求头:
import requests url = "你的完整Blob SAS链接" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept": "application/pdf, */*", "Accept-Language": "en-US,en;q=0.9" } response = requests.get(url, headers=headers) # 主动抛出HTTP错误,方便定位问题 response.raise_for_status() with open('sample.pdf', 'wb') as f: f.write(response.content)
3. 使用Azure官方SDK下载(最可靠方案)
针对Azure Blob存储,使用官方azure-storage-blob SDK可以彻底规避URL参数处理问题:
先安装SDK:
pip install azure-storage-blob
然后编写下载代码:
from azure.storage.blob import BlobClient sas_url = "你的完整Blob SAS链接" blob_client = BlobClient.from_blob_url(sas_url) with open("sample.pdf", "wb") as f: blob_data = blob_client.download_blob() blob_data.readinto(f)
排查提示
- 优先查看
response.status_code:403代表SAS权限失效或参数错误,404代表Blob路径错误,5xx代表服务器端问题。 - 若仍失败,可对比Power Automate的请求日志,完全复刻它的请求头参数。
内容的提问来源于stack exchange,提问作者bourgeoisna
相关产品推荐
相关产品推荐

