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

从EDGAR数据库提取PDF遇阻,求R/Python解决方案

解决SEC EDGAR文档提取的403错误与无XML数据问题

问题背景

尝试从SEC EDGAR条目https://www.sec.gov/Archives/edgar/data/784028/000078402823000002提取PDF信息时遇到以下问题:

  • 使用R的pdftools提取PDF时返回403错误,SEC反爬机制阻止了请求
  • 关联的.txt文件为加密状态
  • 尝试R的XBRL、EDGAR包失效,因为目标公司未发布XML格式数据

之前尝试的R代码:

library(httr)
library(XBRL)
library(edgar)
library(pdftools)

pdf_Academy <- "https://www.sec.gov/Archives/edgar/data/784028/000078402823000002/2022public.pdf"
academyInfo <- pdftools::pdf_info(pdf_Academy) 
academytxt <- pdftools::pdf_text(pdf_Academy)

df0 = httr::GET("https://data.sec.gov/submissions/CIK784028.json")

df1 = edgar::getFilings(cik.no = "784028",filing.year = 2022, downl.permit = "y", form.type = "ALL")

R解决方案

核心是设置合规请求头(包含真实身份信息的User-Agent),绕过SEC反爬限制,同时先下载PDF到本地再处理。

修复后的PDF提取代码

library(httr)
library(pdftools)

# 设置合规User-Agent,必须包含姓名+有效邮箱
headers <- add_headers(
  `User-Agent` = "Your Full Name your.valid.email@example.com"
)

pdf_url <- "https://www.sec.gov/Archives/edgar/data/784028/000078402823000002/2022public.pdf"

# 下载PDF到本地
response <- GET(pdf_url, headers)
writeBin(content(response, "raw"), "2022public.pdf")

# 提取PDF信息与文本
academyInfo <- pdf_info("2022public.pdf")
academytxt <- pdf_text("2022public.pdf")

# 预览提取结果
head(academytxt)

关键说明

  • SEC要求所有请求必须携带包含真实身份的User-Agent,否则直接返回403,这是之前代码失败的核心原因
  • 先下载到本地再处理,避免重复远程请求触发反爬,同时提升处理稳定性

Python解决方案

使用requests设置合规请求头,结合PyPDF2或pdfplumber提取PDF内容,适配SEC的访问规则。

方案1:requests + PyPDF2(基础文本提取)

import requests
from PyPDF2 import PdfReader

# 设置合规请求头
headers = {
    "User-Agent": "Your Full Name your.valid.email@example.com"
}

pdf_url = "https://www.sec.gov/Archives/edgar/data/784028/000078402823000002/2022public.pdf"

# 下载PDF到本地
response = requests.get(pdf_url, headers=headers)
with open("2022public.pdf", "wb") as f:
    f.write(response.content)

# 提取全文档文本
reader = PdfReader("2022public.pdf")
full_text = ""
for page in reader.pages:
    full_text += page.extract_text() + "\n"

# 预览前500字符
print(full_text[:500])

方案2:requests + pdfplumber(精准提取文本/表格)

import requests
import pdfplumber

headers = {
    "User-Agent": "Your Full Name your.valid.email@example.com"
}

pdf_url = "https://www.sec.gov/Archives/edgar/data/784028/000078402823000002/2022public.pdf"

response = requests.get(pdf_url, headers=headers)
with open("2022public.pdf", "wb") as f:
    f.write(response.content)

# 提取文本与表格
with pdfplumber.open("2022public.pdf") as pdf:
    # 提取第一页文本
    first_page_text = pdf.pages[0].extract_text()
    print(first_page_text)
    
    # 提取页面中的表格(如果存在)
    tables = pdf.pages[0].extract_tables()
    if tables:
        print("提取到表格:")
        for row in tables[0]:
            print(row)

关键说明

  • 同样必须设置合规User-Agent,这是访问SEC资源的硬性规则
  • pdfplumber对复杂格式的文本、表格提取效果优于PyPDF2,更适合处理SEC年报类文档

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:51:02