如何用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
相关产品推荐
相关产品推荐

