自动获取网站PDF文件(Website PDF Downloader)
根据用户给出的网站 + 主题,自动在目标网站上下载研究报告等原始 PDF 文件。本技能来自 9 个脚本版本、多个网站(看知球、信通院、AII 工业互联网联盟、央企官网)的实战复盘,核心方法论是「先探测,再编码」——绝不假设页面结构。
触发条件
当用户提出类似需求时使用本技能:
- 「帮我从【网站】下载关于【主题】的研报 PDF」
- 「批量下载【网站】上的报告 / 白皮书 / PDF 文件」
- 「从需要登录的网站自动抓取 PDF 报告」
用户需要提供(缺失时主动询问):
1. 网站名称 / 域名(必填)
2. 主题关键词(必填)
3. 账号密码(网站需要登录时;首次可问用户,或让用户稍后提供)
4. 目标份数(默认 10,首次建议 3)
5. 输出目录(默认 output/<主题>/)
执行流程总览
按下述顺序执行,详细操作手册见 references/website-pdf-download-guide.md(执行前必须读取)。
- 环境准备:确认 Python + Playwright(或本机浏览器自动化 CLI)可用,安装
playwright、requests、pypdf。 - 探测登录页:访问首页找登录入口 → 打印 input/button/form 的 HTML → 用 id/name 属性定位选择器(不用 placeholder)→ 填账号密码、勾协议、提交 → 轮询确认登录成功。
- 探测报告列表页:⚠️ 不要假设导航栏"研究报告"按钮指向报告列表页。打印所有
nav a/menu a的 href,找含report/research/yanbao/baogao的链接,逐个验证是报告列表(有搜索框 + 报告卡片)而非资讯流。 - 探测搜索:定位搜索框与搜索按钮(优先 id > name > class)→ 填关键词 → 点击或 Enter → 等待结果渲染。
- 提取报告列表:只提取匹配详情页 URL 模式(含
detail/report/view)的链接,过滤问答/资讯/广告;提取标题、日期、页数;去重;滚动加载 3 轮;按日期降序取前 N 份。 - 下载单篇:优先级 ①PDF 直链(
requests+ Cookie)→ ②下载按钮(expect_download+save_as)→ ③无入口则跳过并记录,严禁用网页打印冒充 PDF。 - 校验:每份文件必须通过
%PDF魔数 + 页数 ≥ 阈值双验证(可用scripts/validate_pdf.py),不合格删除重来。 - 命名与续传:
{序号:02d}_{标题}.pdf;启动时扫描已有文件跳过已下载;序号从最大 +1。 - 登录态守护:每次操作前检测 URL 是否含 login、是否出现登录表单、是否提示"登录失效",掉了自动重登。
- 输出:控制台逐篇打印
✅ 序号 标题 (页数, 大小)或⏭️ 标题 (跳过原因);最终统计成功 X 份 / 跳过 Y 份 / 失败 Z 份。
使用技能内资源
references/website-pdf-download-guide.md:执行前必读。包含 9 步详细操作、选择器探测规则、占位符参数表、7 大踩坑复盘。scripts/validate_pdf.py:PDF 校验脚本。用法:python validate_pdf.py <file.pdf> [--min-pages 10],返回 JSON(是否真 PDF、页数、大小、文件名建议)。下载完每个文件后调用它校验,不合格即删除。
关键红线(违反即返工)
- 只下原始 PDF——严禁用
page.pdf()打印网页充当报告;只接受服务器返回的.pdf文件。 - 先探测再编码——每个关键步骤前先截图 + 打印页面源码,确认真实 DOM 后再写选择器。
- 魔数必查——文件前 4 字节必须为
b"%PDF"。 - 能断点续传——中途中断后重跑必须跳过已下载文件。
- 登录态守护——长任务运行中掉登录必须自动重登,不能静默失败。
完成后交付
- 在用户指定的输出目录(默认
output/<主题>/)生成01_标题.pdf…N_标题.pdf - 向用户汇报:成功 / 跳过 / 失败份数、文件位置、每份页数与大小
- 有失败项时说明原因(无下载入口 / 页数不足 / 网络错误),并提示可重试