使用BeautifulSoup爬取的PDF均损坏且大小一致,求代码排查
问题排查与修复方案
你下载的PDF无法打开且大小一致,说明实际下载的不是真实PDF文件,大概率是请求错误导致服务器返回了错误页面(比如404/403提示页),以下是代码中的问题和修复方式:
核心问题点
- URL转义字符错误:代码拼接
pdf_url时用了&,这是HTML的转义字符,实际HTTP请求中需要用原始的&,服务器无法识别&参数,因此返回错误页面。 - 缺少请求头模拟:部分网站会拦截无浏览器标识的请求,直接返回非预期内容。
- 未校验响应状态:没有判断请求是否成功,错误内容也会被写入文件。
- 冗余的文件关闭操作:
with open上下文管理器会自动关闭文件,手动调用f.close()属于多余操作。
修复后的代码
import os import requests from bs4 import BeautifulSoup # 目标页面URL url = 'https://www.someweb.de/medikamente/arzneimittellisten/medikamente_i.html' # 保存路径 save_path = r'C:\PDFs' # 创建保存目录 if not os.path.exists(save_path): os.makedirs(save_path) # 模拟浏览器请求头,避免被拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 请求目标页面 response = requests.get(url, headers=headers) # 确保请求成功,失败则抛出异常 response.raise_for_status() # 解析页面内容 soup = BeautifulSoup(response.content, 'html.parser') # 筛选包含PDF的链接 links = soup.find_all('a', href=lambda href: href and '/medikamente/beipackzettel/' in href) # 遍历下载每个PDF for link in links: href = link['href'] # 生成唯一文件名 file_name = href.split('?')[0].split('/')[-1] + '.pdf' # 修正URL中的转义字符,用&代替& pdf_url = 'https://www.someweb.de' + href + '&file=pdf' # 请求PDF文件 pdf_response = requests.get(pdf_url, headers=headers) # 校验请求是否成功 pdf_response.raise_for_status() # 写入文件 with open(os.path.join(save_path, file_name), 'wb') as f: f.write(pdf_response.content) print(f'已下载 {file_name} 到 {save_path}')
额外说明
- 添加
headers模拟浏览器请求,避免被网站反爬机制拦截。 - 使用
raise_for_status()在请求失败时直接抛出异常,便于快速定位问题。 - 修正URL中的转义字符后,服务器能正确识别
file=pdf参数,返回真实的PDF文件。
内容的提问来源于stack exchange,提问作者Mr.Slow
相关产品推荐
相关产品推荐

