网页转PDF格式
⚠️ 执行前必读:必须先让用户选择模式
本技能有 3 种可选工作模式,互不替代。收到任意「转 PDF / 导出 / 保存」类请求后,在正式执行前,必须先用下面这句话向用户确认模式,等用户回复后再动手:
请选择转换模式:1 完整网页导出 / 2 纯净文章提取导出 / 3 图片电子书抓取。
不要替用户默认模式。如果用户已在消息里明确说了模式(例如"只要正文""整页原样""这是教材逐页抓"),可直接对应,但仍建议在动手前复述确认一次。
三模式总览
| 模式 | 名称 | 适用场景 | 脚本 |
|------|------|----------|------|
| 模式 1 | 完整网页原样导出 | 需要网页"原封不动"的副本:导航、广告、侧栏、样式全部保留,忠实渲染 | scripts/full_page_pdf.py |
| 模式 2 | 纯净单篇文章提取导出(推荐新闻、资讯文章) | 只要正文、不要网站花哨外壳;要一份干净可阅读的 PDF | scripts/article_pdf.py |
| 模式 3 | 图片型在线阅读器抓取模式(教材、漫画、绘本) | 内容是连续分页图片(教材/漫画/绘本/期刊),如 book.pep.com.cn | scripts/waf_ebook_pdf.py(批量:waf_ebook_batch.py) |
模式 1:【完整网页原样导出】
- 使用 headless Edge 的
page.pdf()忠实渲染整张网页的所有内容生成 PDF。 - 不对网页内容做任何删减、过滤、重新排版——导航栏、广告、侧边栏、页脚、弹窗等网页上的所有元素原样输出到 PDF(
print_background=True保留背景色/背景图)。 - 即"浏览器 Ctrl+P → 另存为 PDF"的自动化版本,HTML/CSS 怎么显示就怎么印。
- 参数:
--paper a4|letter(默认 a4)、--out 文件名.pdf。
模式 2:【纯净单篇文章提取导出(推荐新闻、资讯文章)】
- 自动定位网页中的文章正文区块(常见 CMS 容器选择器 + 通用兜底:取全文最长文本块的最小公共祖先)。
- 严格剔除(站点级噪声多轮组合拳,绝不进入 PDF):
- 站点模块:导航栏、页头/页脚、侧边栏、广告横幅、客服弹窗、问卷/意向表单、App 下载区、版权备案、二维码、热门排行(人民网
.rm_ranking位于正文容器内两列布局的右列,也会被剪); - 推荐区全文预览:命中「猜您喜欢 / 猜你喜欢 / 相关推荐 / 延伸阅读 / 热门推荐 / 热门排行」等推荐标题后,删除其后所有兄弟节点(部分站把推荐文章全文放在标题后的独立节点/
<textarea>里,仅删列表 class 剪不干净); - 阅读工具条:正文顶部「收藏大字号/收藏小字号/点击播报本文」等按钮只删按钮块本身(短文本 + 前缀匹配),绝不误伤同容器的日期/来源元信息;
- 脚本与样式:
SCRIPT / STYLE / NOSCRIPT内容一律跳过(JS 代码文本不是正文); - 文本特征补刀:命中「版权所有/京ICP/扫码下载/客户端下载/分享让更多人」等站点信息关键字即删整块(正序先父后子,功能工具栏整块命中即整块删除)。
- 站点模块:导航栏、页头/页脚、侧边栏、广告横幅、客服弹窗、问卷/意向表单、App 下载区、版权备案、二维码、热门排行(人民网
- 正文内容完整保留:正文区块内的所有配套图片、表格、列表格式完整保留。
- 图片:默认完整嵌入(懒加载触发 + 三重兜底:元素截图 → canvas 渲染 → urllib 直取原图(纯 Python 网络栈,带 UA + Referer 模拟浏览器,专治跨域图与透明占位图));JS 收集阶段即按 src 去重(页面常为 PC/移动双套布局重复引用同一批图,只收首次出现,杜绝重复图与"图片缺失"),二维码/站点装饰图标 URL 黑名单过滤。
- 表格:数据表整表截图保留完整行列结构,禁止仅提取表格文字而丢失表格布局;布局表(gov.cn 等把整篇正文排版在 table 里,无表头 + 文本 >600 字 + 段落丰富)自动识别并改按文本提取,避免正文变成一张超高图。
- 列表:保留项目符号 / 序号与层级缩进(无序
•、有序1. 2. 3.,嵌套层级缩进)。 - 只收录正文内配图;所有广告图片、非正文图片一律丢弃。
- 特殊载体:正文存放在
<textarea>的站点(如古诗文网把原文/译文/赏析存于 textarea.value),显式提取其 value 作为正文;行尾附带的来源 URL 自动清洗。
- 基于纯净正文重新排版为干净 A4 PDF:标题居中加粗、日期/作者居中灰字、正文两端对齐 + 首行缩进 2 字符、行距 1.8,内容铺满内页。
- 参数:
--paper a4|letter、--font-size N、--no-images(仅丢弃装饰性插图,表格/列表仍保留)、--merge(多篇合订)、--out。
模式 3:【图片型在线阅读器抓取模式(教材、漫画、绘本)】
- 针对图片型连续分页站点(教材、漫画、绘本、期刊等,如
book.pep.com.cn)。 - 自动完成页面验证、从 DOM 自动推断图片分页规律(前缀+序号+后缀,支持前导零/变宽编号),逐页抓取图片,本机用 Pillow 合成 PDF。
- 全程本机处理,不上传云端。
- 被访问保护(HTTP 403)的页面需用户提供带
u_atoken/u_asession的分享链接。 - 合规提示:模拟滑块验证为可选模式、默认关闭(见"风险提示")。
When to use / 触发条件
- 用户消息含「转 PDF / 生成 PDF / 保存为 PDF / 下载 / 导出 / 离线保存」等意图词并附来源网页链接。
- 用户明确只要正文 / 只要某篇文章 / 去掉网页多余内容 → 模式 2(文章提取)。
- 用户要网页原样副本(含所有元素、不改动)→ 模式 1(整页导出)。
- 链接形如
https://book.pep.com.cn/<bookid>/mobile/index.html(或带u_atoken/u_asession分享参数)→ 模式 3(图片阅读器)。 - 用户一次性粘贴多个同类链接要求批量导出 → 模式 2 用
--merge,模式 3 用waf_ebook_batch.py。
不应触发:需要账号登录的私有页面;内网 / 本地地址(127.0.0.1、localhost、192.168.x、file://,被内置安全拦截拒绝);被访问保护拦截(HTTP 403)的页面(需分享链接)。
Requirements
- Python 3 + 隔离 venv 安装:
playwright、Pillow、requests、reportlab。 (reportlab仅模式 2 需要;模式 1、3 不需要。) - 系统 Microsoft Edge 浏览器(Windows),Playwright 用
channel="msedge",不依赖下载版 Chromium。 - 运行环境要求 Windows + 系统 Edge。
Workflow(通用)
- 先确认模式(见顶部"执行前必读"):用标准话术问用户
1 完整网页导出 / 2 纯净文章提取导出 / 3 图片电子书抓取,拿到选择后再继续。 - 校验依赖(playwright / Pillow / requests 在 venv;模式 2 另需 reportlab;Edge 存在)。
- 按所选模式运行对应脚本(见下方"调用示例")。
- 用
present_files交付 PDF。模式 3 的临时图片在ebook_pages_<bookid>/,可删可留。
调用示例
模式 1:完整网页原样导出
python <skill>/scripts/full_page_pdf.py "https://www.gov.cn/zhengce/2024-01/01/content_6923801.htm"
# 输出:<页面标题>.pdf(当前工作目录,浏览器原生打印,网页所有元素原样保留)
python <skill>/scripts/full_page_pdf.py "https://.../page.html" --paper letter --out 整页.pdf
模式 2:纯净文章提取导出(亮点)
# 单篇 → 干净 A4 PDF(默认配图/表格/列表全保留)
python <skill>/scripts/article_pdf.py "https://cpc.people.com.cn/n1/2026/0702/c64094-40752071.html"
# 自定义:Letter 纸型 + 15pt 字号(配图/表格/列表仍保留)
python <skill>/scripts/article_pdf.py "https://.../article.html" --paper letter --font-size 15
# 仅丢弃装饰性插图(表格、列表照常保留,体积更小)
python <skill>/scripts/article_pdf.py "https://.../article.html" --no-images
# 同专题多篇 → 合并为一个合订本 PDF
python <skill>/scripts/article_pdf.py "https://.../a.html" "https://.../b.html" --merge --out 合订本.pdf
模式 3:图片型阅读器抓取(教材/漫画/绘本)
python <skill>/scripts/waf_ebook_pdf.py "https://book.pep.com.cn/1261001102241/mobile/index.html"
# 输出:<教材标题>.pdf(逐页抓取,本机合成)
# 批量(每本各过各的验证、互不干扰):
python <skill>/scripts/waf_ebook_batch.py \
"https://book.pep.com.cn/1261001201251/mobile/index.html" \
"https://book.pep.com.cn/1261001202251/mobile/index.html"
模式 2 已实测可精准提取的站点(均为真实公开网页)
- 时政公文:人民网
cpc.people.com.cn(容器.rm_txt,全文讲话 7 页 4883 字,收藏/播报工具条、相关专题全部剪除) - 政务政策:中国政府网
gov.cn(容器.article) - 技术文档:Python 官方文档
docs.python.org(容器.document) - 新闻资讯:新华网
news.cn、人民网people.com.cn(健康科普,正文 1 张大图完整嵌入,热门排行/客户端下载区/收藏播报工具条全部剪除;表格/列表格式完整保留) - 考试资料:中国教育在线
eol.cn - 图书诗词:古诗文网
gushiwen.cn(正文存于 textarea.value 的站点——显式提取 value,原诗+作者简介纯净输出,推荐区「猜您喜欢」全文预览、生肖装饰图、二维码全部剪除) - 文娱:新华网文化
news.cn/culture、中国新闻网文化chinanews.com.cn/cul - 科技创投:36氪
36kr.com(容器.article-content) - 体育:新华网体育
news.cn/sports - 财经:澎湃新闻
thepaper.cn(容器main) - 新能源汽车等数据榜单类:新浪
k.sina.com.cn等(容器.article-content,正文内表格/列表保留)
注:部分站点有 Cloudflare / 滑块 / JS 渲染反爬(如百度百科、下厨房、美食天下、证券时报、新浪财经),自动化访问会被拦截或抽不到正文,属站点防护而非本技能问题;这类页面需用户手动在浏览器打开后另存,或提供可访问链接。教材类(图片型阅读器)由模式 3 处理。
Key pitfalls(模式 3 图片阅读器,踩坑经验)
- 不要用
headless=True跑滑块验证:WAF 检测navigator.webdriver会失败(error:rTUKf),验证页用headless=False+--disable-blink-features=AutomationControlled。模式 1、2 用headless=True即可。 - 滑块选择器
.nc_scale .btn_slide;拖动距离 = 轨道宽 − 滑块宽;用 smoothstep 缓动 + 抖动模拟真人。 - 复用会话:验证后读
ctx.cookies()建requests.Session(带Referer),按发现的prefix + n + suffix顺序下载,直到 404 标记末页。图片受 cookie 保护,无验证 cookie 直连会失败。 - 分享链接有时效,
u_atoken/u_asession是限时的,拿到链接尽快生成。 - 多本书批量:每本开全新上下文(各自过滑块、各自拿 token),绝不可跨书复用 cookie(会 403)。
- WAF token 是每本而非每会话:多链接务必用
waf_ebook_batch.py(每本独立上下文)。
使用限制
- 仅支持公开互联网网页(https://);不支持需登录/权限的私有网页;不支持内网 / 本地地址(
127.0.0.1、localhost、192.168.x.x、10.x.x.x、file://)。 - 模式 3 适用于图片型阅读器(教材/漫画/绘本/期刊等),自动推断连续编号规律(支持前导零与变宽编号);非图片型或图片无连续编号则自动改走模式 1 打印。
- HTTP 403 受保护页面无法转换,需用户提供带
u_atoken/u_asession的分享链接。 - 运行环境:Windows + 系统 Microsoft Edge(Playwright
channel="msedge")。 - 仅本机本地转换,不依赖任何第三方付费接口或云服务。
风险提示
- 仅支持公开互联网网页;不支持需登录/权限的私有网页,不支持内网地址。
- 本技能通过你的浏览器直接访问目标网页,图片从来源网站下载并在本机合成 PDF;不会把网页内容上传到任何未知第三方。请勿输入含个人隐私的网页链接。
- 本技能无内置 API 密钥、不需要任何第三方密钥;使用者只需本机已装 Microsoft Edge。
- 模拟滑块验证为可选模式、默认关闭(合规考虑,避免默认绕过站点访问控制)。默认遇滑块验证页面会提示用户提供带
u_atoken的分享链接;仅当用户显式设置WEB2PDF_SLIDER=1(或--slider)时才尝试模拟滑块。请仅用于你有权使用的资料。 - 功能依赖外部网站页面结构与 WAF 行为,若对方改版可能失效;带 token 的分享链接有时效,过期需重新获取。
资源文件(Resources)
- 上架提交表单(结构化 JSON,随包提供):
assets/网页转PDF格式_提交表单.json- 含基本信息、亮点、三模式总览、参数、安全合规、自测用例、依赖与提交注意事项;审核或二次提交时直接读取此文件。
Scan to join WeChat group