You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python下载自动生成PDF的链接并自定义文件名?

解决动态生成PDF链接的批量下载问题

问题根源

这类非.pdf后缀的动态生成链接,服务器通常会校验请求的合法性——比如检查是否来自真实浏览器、是否携带会话信息。你之前的代码直接发起请求,缺少必要的请求头标识,导致服务器无响应或挂起请求。

可行解决方案

核心思路:模拟浏览器请求

通过添加浏览器请求头、设置超时、处理重定向,让服务器识别为合法请求,同时避免程序无限挂起。

修改后的单文件下载代码

from pathlib import Path
import requests

# 模拟Chrome浏览器请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5'
}

filename = Path('test.pdf')
url = 'https://checkaproduct.se.com/DistantRequestDispatcher.aspx?action=export&pid=62035238&lang=en_us'

try:
    # 30秒超时+跟随重定向+携带请求头
    response = requests.get(url, headers=headers, allow_redirects=True, timeout=30)
    response.raise_for_status()  # 捕获HTTP错误(如403、500)
    print(f"响应状态码: {response.status_code}")
    
    filename.write_bytes(response.content)
    print(f"PDF已保存为: {filename}")
except requests.exceptions.RequestException as e:
    print(f"下载失败: {e}")

批量下载封装

如果需要处理数千个PID,可封装成循环函数,同时控制请求频率避免被封禁:

from pathlib import Path
import requests
import time

def download_pdf(pid, lang='en_us', save_dir='pdfs'):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5'
    }
    url = f'https://checkaproduct.se.com/DistantRequestDispatcher.aspx?action=export&pid={pid}&lang={lang}'
    save_path = Path(save_dir) / f'product_{pid}.pdf'
    
    # 自动创建保存目录
    save_path.parent.mkdir(exist_ok=True)
    
    try:
        response = requests.get(url, headers=headers, allow_redirects=True, timeout=30)
        response.raise_for_status()
        save_path.write_bytes(response.content)
        print(f"成功下载: {save_path}")
    except requests.exceptions.RequestException as e:
        print(f"PID {pid} 下载失败: {e}")

# 批量处理示例(替换为你的PID列表)
pid_list = [62035238, 12345678, 87654321]
for pid in pid_list:
    download_pdf(pid)
    time.sleep(1)  # 间隔1秒,避免请求过于频繁

额外优化建议

  • 如果仍失败:可从浏览器复制登录后的Cookie,添加到headers['Cookie']中,模拟已登录状态
  • 提升效率:使用requests.Session()复用会话连接,减少重复握手开销
  • 异常处理:可增加重试逻辑,针对网络波动等临时问题自动重试

内容的提问来源于stack exchange,提问作者Kazeyoshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:10:18