Python爬虫下载PDF文件

在 Python 中下载 PDF 文件可以通过多种方式实现,最常用的是使用 requests 库发送 HTTP 请求获取文件内容,再写入本地文件。以下是详细的实现方法:

文章目录

  • [方法一:使用 `requests` 库(推荐)](#方法一:使用 requests 库(推荐))
  • [方法二:使用 `urllib`(Python 标准库,无需额外安装)](#方法二:使用 urllib(Python 标准库,无需额外安装))
  • 关键说明
  • 常见问题

方法一:使用 requests 库(推荐)

requests 是处理 HTTP 请求的常用库,简洁高效,适合大多数场景。

  1. 安装 requests(若未安装):

    bash 复制代码
    pip install requests
  2. 代码示例:

    python 复制代码
    import requests
    
    def download_pdf(url, save_path):
        try:
            # 发送 GET 请求,stream=True 表示流式下载(适合大文件)
            response = requests.get(url, stream=True, timeout=10)
            # 检查请求是否成功(状态码 200)
            response.raise_for_status()
    
            # 写入本地文件
            with open(save_path, 'wb') as f:
                # 分块写入,避免占用过多内存
                for chunk in response.iter_content(chunk_size=1024):
                    if chunk:  # 过滤空块
                        f.write(chunk)
            print(f"PDF 文件已成功下载至:{save_path}")
    
        except requests.exceptions.RequestException as e:
            print(f"下载失败:{e}")
    
    # 示例:下载一个公开的 PDF 文件
    pdf_url = "https://example.com/sample.pdf"  # 替换为目标 PDF 的 URL
    save_location = "downloaded_file.pdf"       # 保存路径(可自定义)
    download_pdf(pdf_url, save_location)

方法二:使用 urllib(Python 标准库,无需额外安装)

如果不想依赖第三方库,可以使用 Python 内置的 urllib 模块。

python 复制代码
from urllib.request import urlretrieve
from urllib.error import URLError, HTTPError

def download_pdf_urllib(url, save_path):
    try:
        # 直接下载并保存文件
        urlretrieve(url, save_path)
        print(f"PDF 文件已成功下载至:{save_path}")
    except (URLError, HTTPError) as e:
        print(f"下载失败:{e}")

# 示例
pdf_url = "https://example.com/sample.pdf"
save_location = "urllib_download.pdf"
download_pdf_urllib(pdf_url, save_location)

关键说明

  1. URL 合法性 :确保目标 URL 直接指向 PDF 文件(通常以 .pdf 结尾),部分网站可能需要登录或处理反爬,此时需额外添加请求头(如 User-Agent)。

    示例(带请求头的 requests 用法):

    python 复制代码
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    response = requests.get(url, headers=headers, stream=True)
  2. 大文件处理:

    • requests 中使用 stream=True 和 iter_content(chunk_size) 分块下载,适合大文件,避免内存溢出。
    • urllib 的 urlretrieve 内部也会分块处理,无需额外配置。
  3. 保存路径:

    • 若指定路径(如 ./docs/file.pdf),需确保父目录存在(可通过 os.makedirs 提前创建)。

常见问题

  • 403 错误 :网站拒绝访问,需添加 User-Agent 模拟浏览器。
  • 404 错误:URL 无效,检查目标 PDF 地址是否正确。
  • 文件损坏:可能是下载中断或 URL 指向的并非 PDF 文件,可尝试重新下载并验证文件格式。

通过以上方法,即可稳定下载大多数公开可访问的 PDF 文件。

相关推荐
卷无止境2 小时前
一人公司的全栈选型指南:让 AI Agent 写得快,也让生意跑得稳
后端·python
滴啦嘟啦哒4 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
全栈练习生4 小时前
AI安全与红队测试
python·ai
费曼学习法4 小时前
把「发送成功」当「送达」?我排查 IM 长消息被静默吞掉的完整过程
python·ai编程·自动化运维
鸽鸽程序猿4 小时前
【项目】【在线判题系统】b端题目增删改
开发语言·python
NetX行者4 小时前
Python 工程化入门:从脚本到规范的 Python 项目结构
网络·python
MasonYyp5 小时前
asyncio并发协程
python
小小张说故事5 小时前
Python 的整数为什么永远不会溢出?拆开大整数对象,看 30 位一节的存储与运算代价
python
用户298698530145 小时前
Python 实现 Word 与 TIFF 双向转换的方案
后端·python·api
benchmark_cc5 小时前
实时行情和分钟 K 线应该如何配合使用?从信号计算到交易决策的完整分析
大数据·python·数据分析·pandas·量化交易·股票数据·quantdash