从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
相关产品推荐
相关产品推荐

