从DataFrame的URL列读取在线PDF并提取文本至新列
批量提取DataFrame中URL对应的PDF文本到新列
没问题,我来帮你搞定这个需求——从DataFrame的URL列批量提取PDF文本到新列。下面是具体的实现方案,考虑到500+行的规模和可能出现的异常(比如链接失效、PDF无法解析),我会给出稳健的代码:
第一步:安装必要的库
你需要用到几个Python库来处理DataFrame、HTTP请求和PDF文本提取:
pip install pandas requests pdfplumber # 如果想加速批量处理,可以额外安装swifter pip install swifter
第二步:核心实现代码
import pandas as pd import requests import pdfplumber from io import BytesIO # 定义PDF文本提取函数,包含异常处理 def extract_pdf_text(url): try: # 模拟浏览器请求,避免被网站拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 发送请求获取PDF内容 response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() # 检查请求是否成功 # 用pdfplumber读取PDF并提取文本 with pdfplumber.open(BytesIO(response.content)) as pdf: text = "" for page in pdf.pages: page_text = page.extract_text() if page_text: # 避免空页报错 text += page_text + "\n" return text.strip() except Exception as e: # 捕获所有异常,返回错误信息方便后续排查 return f"提取失败: {str(e)}" # 假设你的DataFrame名为df,URL列名为"URL" # 示例DataFrame(替换成你自己的DataFrame即可) data = { "URL": ["https://www.occ.gov/static/enforcement-actions/ea2018-001.pdf"] } df = pd.DataFrame(data) # 应用函数到URL列,生成新列「PDF data」 # 如果数据量很大(500+行),可以用swifter加速(自动选择并行/串行) # df["PDF data"] = df["URL"].swifter.apply(extract_pdf_text) df["PDF data"] = df["URL"].apply(extract_pdf_text) # 查看结果 print(df.head())
关键细节说明
- 异常处理:函数里捕获了请求超时、链接失效、PDF解析失败等各种异常,返回错误信息,不会导致整个批量任务中断
- 请求头模拟:添加
User-Agent模拟浏览器请求,很多网站会拦截无标识的爬虫请求 - PDF文本提取:用
pdfplumber比PyPDF2更准确,能更好地处理复杂排版的PDF - 性能优化:如果500+行处理速度慢,安装
swifter后替换成带swifter.apply的代码,它会自动根据数据量选择并行处理,提升效率
注意事项
- 大文本存储:提取的PDF文本可能非常长,pandas完全支持存储大文本,但如果后续要导出到Excel,注意Excel单元格有字符限制(约32767字符),可以选择导出为CSV或者JSON格式
- 反爬限制:如果频繁请求被网站封禁,可以在函数里添加
time.sleep(1)(需要导入time库),每次请求后暂停1秒,降低请求频率 - 本地缓存:如果需要重复处理,可以把已提取的PDF文本本地缓存起来,避免重复请求相同链接
内容的提问来源于stack exchange,提问作者Ni_Tempe
相关产品推荐
相关产品推荐

