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=Trueiter_content(chunk_size) 分块下载,适合大文件,避免内存溢出。
    • urlliburlretrieve 内部也会分块处理,无需额外配置。
  3. 保存路径

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

常见问题

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

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

相关推荐
孟健5 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞7 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽9 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程13 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪14 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook14 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python