PDF链接提取需用BeautifulSoup解析DOM并补全路径,扫描iframe/script中硬编码,检查Content-Disposition;下载前验证HTTP状态码、Content-Type及PDF魔数;pdfplumber提取表格应先裁剪区域、调参或坐标聚类;反爬需随机UA、模拟浏览器头、会话管理与指数退避。

PDF链接藏在HTML里,但正则匹配总漏掉或抓错
实操建议:
- 优先用
BeautifulSoup解析DOM,查所有a标签的href属性,再用urllib.parse.urljoin(base_url, href)补全相对路径 - 额外扫描
iframe[src]、script文本中类似document.location = "xxx.pdf"的硬编码,用re.search(r'["\']https://www.php.cn/link/4a33edb840d8caeb24bbcb1b0ce1d8d7"\']+\.pdf[^"\']*)["\']', script_text, re.I)配合re.I忽略大小写 - 别忘了检查
Content-Disposition响应头——有些PDF没显式链接,而是通过表单提交后返回的,得抓form[action]并模拟POST
PyPDF2读取在线PDF报PdfReadError: Not a PDF file
常见于服务器返回了重定向响应(HTTP 302)、登录跳转页(HTML)、防盗链拦截页(如403或自定义错误页),但PyPDF2.PdfReader直接喂了HTML内容,自然报错。
实操建议:
- 下载前务必检查
response.status_code == 200且response.headers.get('content-type', '').lower().startswith('application/pdf') - 用
requests.get(url, stream=True),先读前1024字节判断魔数:response.raw.read(4) == b'%PDF',不是就立刻中断 - 遇到需要Cookie或Referer才能访问的PDF,别只传headers,记得复用登录态的
session对象,否则PyPDF2读到的是登录页HTML
pdfplumber提取表格时列错位、文字重叠
pdfplumber默认按视觉位置切分单元格,但扫描版PDF或复杂排版(多栏、浮动文本框、合并单元格)会让坐标计算失效,导致page.extract_table()返回None或结构混乱。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实操建议:
- 先用
page.to_image().save("debug.png")保存可视化快照,确认目标区域是否真能被肉眼识别为表格 - 手动指定
vertical_straight_line_tolerance和horizontal_straight_line_tolerance参数(默认1,可调到3–5)来容忍扫描失真 - 对无边框表格,改用
page.extract_words(x_tolerance=3, y_tolerance=3)拿到所有文字块坐标,再按y轴聚类行、x轴切分列——比依赖线检测更稳 - 别直接
extract_table()整个页面,用page.crop((x0, y0, x1, y1))先裁出表格区域再处理
批量下载PDF时被封IP或触发反爬
PDF报告常是重点防护资源,连续请求会触发验证码、限速(HTTP 429)或直接断连。用time.sleep()硬等只是治标,关键在降低指纹特征。
实操建议:
- 每请求前更新
headers['User-Agent'],从真实浏览器列表随机选,别用默认python-requests - 加
headers['Accept-Language'] = 'zh-CN,zh;q=0.9,en;q=0.8'和headers['Sec-Fetch-Dest'] = 'document',让请求更像人工浏览 - 用
requests.Session()复用连接,但每次请求后调用session.cookies.clear()避免会话污染 - 遇到429或503,暂停时间别固定:用
random.uniform(2, 8)秒,再指数退避重试(最多3次)
真正麻烦的是PDF本身带数字水印、JavaScript动态加载内容,或者用了Cloudflare Worker做渲染拦截——这时候PyPDF2和pdfplumber都无能为力,得切到无头浏览器。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










