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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:46:05