用户发来 https://mp.weixin.qq.com/s/ZEOsi4R4JcmZ_mhS6qpcww,存进库的正文只有 67 个字符 ("原文链接 + 一个句号")。复盘发现公众号换了渲染方式:新版页面把整篇塞进 window.cgiDataNew 这个 JS 对象由前端渲染,页面里根本没有 id="js_content"; 三种 UA 拿到的字节数完全一样,也不是 UA 的问题。 - 从 JS 字符串字面量里读正文(content_noencode / desc),按 \xNN、\uNNNN 反转义, 话题标签是双重转义过的 HTML,先 unescape 再走 DOM。 - 配图字段排在文字之后,所以前后各找 2500 字符合图;剩下没用过的 mmbiz 图按 12 张上限补在末尾(图文型文章靠就近配对会漏)。 - 解析顺序:旧 DOM → 新版 JS 数据 → 通用抽取,一层层退。 实测两篇:2373 字符 + 12 张图、2772 字符 + 13 张图,作者也都取到了。 同时补上用户提的两件: - 知识能删了:DELETE /knowledge/{id}?confirm=true,软删 + 真删检索切片, 只有作者或 owner/admin 能删;列表卡片(悬停出现)和阅读页动作行各一个入口。 删完详情也回 7001,否则收藏的链接还能打开一篇已删除的知识。 - 分类下面有标签清单了:GET /knowledge/tags 按标签数"有多少条知识用了它", 侧栏渲染成 #标签 + 条数,点一下筛选、再点取消。
公众号的文章也能抓:走 mp.weixin.qq.com 的 DOM(#js_content), 按 data-src 取图,不靠通用抽取器——它会把公众号的图全丢掉。 正文里的外链图下载进我们自己的存储(最多 12 张、单张 8 MB), 地址改成 /attachments/{id}/raw?签名:公众号那边一换图,外链就是一排红叉。 抓取入口谁都能触发,所以只允许公网地址(内网段、回环、链路本地、 保留段、解析不出的域名一律拒绝),否则就是个 SSRF 跳板。 抓不到要说人话:"这个链接没抓下来(原因)。想直接记成任务的话, 加「任务:」前缀再发一次。" 反爬验证页、SPA 空壳都走这条路。 - 新增 services/article.py:extract_url / parse / fetch / store_images / compose_body - wechat_intake:整条消息是链接时走抓取,落知识草稿,回「已存成知识草稿:标题」 - 依赖 trafilatura==2.0.0(装法见 requirements.txt 注释:必须逐个装再 --no-deps) - 测试 9 例:链接判定、公众号解析、验证页、通用页裁导航、SSRF 拒绝、图片本地化、失败提示