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

Python3使用FancyURLopener获取PDF遇HTTP403及DeprecationWarning问题求解

解决urllib.request.FancyURLopener弃用警告并成功下载银行PDF文件

问题背景

你尝试从银行网站获取PDF用于数据挖掘时遇到HTTP 403错误,于是改用FancyURLopener模拟浏览器User-Agent,但运行代码时收到了弃用警告:

C:\Users\Name\Anaconda3\lib\site-packages\ipykernel_launcher.py:8: DeprecationWarning: MyOpener style of invoking requests is deprecated. Use newer urlopen functions/methods

解决方案

FancyURLopener确实已经被Python官方标记为过时API,咱们换成更现代的urllib.request用法即可,同时还能保持模拟浏览器请求的能力来绕过403限制,具体实现如下:

替代代码示例

import urllib.request

# 替换为你的银行PDF实际链接
my_url = 'your-bank-pdf-url-here'

# 构造完整的请求头,模拟Chrome浏览器的请求
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,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'
}

# 创建Request对象,绑定URL和请求头
req = urllib.request.Request(url=my_url, headers=headers)

try:
    # 打开链接并处理响应
    with urllib.request.urlopen(req) as response:
        # 读取PDF二进制内容
        pdf_data = response.read()
        # 将内容写入本地文件,方便后续PDF mining
        with open('bank_document.pdf', 'wb') as output_file:
            output_file.write(pdf_data)
    print("PDF文件已成功下载并保存!")
except urllib.error.HTTPError as http_err:
    print(f"HTTP请求错误: {http_err.code} - {http_err.reason}")
except Exception as err:
    print(f"意外错误: {str(err)}")

代码关键点解释

  • 请求头设置:除了User-Agent,还添加了Accept、Accept-Language等字段,更贴近真实浏览器的请求特征,降低被反爬拦截的概率
  • 资源自动管理:使用with语句自动处理连接和文件的关闭,避免资源泄漏
  • 异常处理:捕获HTTP错误和通用异常,方便快速定位问题(比如如果还是403,可以尝试添加Referer字段,指定该PDF所在的页面链接)
  • 本地保存:直接将PDF二进制内容写入文件,为后续的PDF数据挖掘做好准备

额外提示

如果仍然遇到403错误,可以尝试:

  • 更换最新的浏览器User-Agent标识(可以在浏览器的开发者工具中查看自己的真实UA)
  • 添加Cookie字段:如果网站需要登录才能访问PDF,可以先在浏览器中登录,然后复制对应的Cookie值到请求头中
  • 尝试使用requests库(如果你的环境允许安装第三方库),它的API更简洁,处理请求头和异常也更方便:
import requests

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'
}

response = requests.get(my_url, headers=headers)
response.raise_for_status()  # 抛出HTTP错误
with open('bank_document.pdf', 'wb') as f:
    f.write(response.content)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:08:53