需用node.js和本机chrome批量抓取公众号文章为结构化markdown:先配置puppeteer_executable_path指向chrome,再运行脚本逐条处理urls.txt中的mp.weixin.qq.com/s/链接,自动下载图片并重写为本地路径。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要从多个网页批量提取正文、图片和链接,并直接存为结构化 Markdown 文件,而不是手动复制粘贴每一篇。
准备抓取环境
先确认本地已安装 Node.js(v18.0+)和 Google Chrome 浏览器。Codex 抓取公众号 Skill 依赖 Puppeteer,它默认会尝试下载 Chromium,但国内网络常失败且体积大;【必须使用本机已安装的 Chrome】才能跳过这一步,大幅缩短初始化时间。
打开终端,执行 node -v 和 google-chrome --version(macOS)或 chrome.exe --version(Windows)验证两者存在。
若 Chrome 已安装但终端无法识别命令,请将 Chrome 可执行文件路径加入系统环境变量,或记下完整路径备用(如 C:\Program Files\Google\Chrome\Application\chrome.exe)。
获取并配置微信公众号抓取 Skill
访问阿一 AI 站文章页:https://www.php.cn/link/aa7d314c99cb745f0d195cc594ac56fd,找到「微信公众号文章抓取 Skill」下载链接,点击下载 ZIP 包(约 9.5MB)。
解压到任意本地文件夹,例如 ~/codex-skills/wechat-scrape。
进入该目录,用文本编辑器打开 SKILL.md,确认其触发条件为匹配 mp.weixin.qq.com/s/ 开头的 URL——这是后续自动调用的关键依据。
设置环境并运行单次抓取
在解压目录中打开终端,执行:
npm install
安装完成后,设置环境变量指向本机 Chrome:
macOS/Linux:export PUPPETEER_EXECUTABLE_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
Windows(PowerShell):$env:PUPPETEER_EXECUTABLE_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"
然后运行抓取脚本:node scripts/save-markdown.js "https://mp.weixin.qq.com/s/xxxxx"(把 xxxxx 替换为目标文章真实 ID)。
通过本地 Codex 或 OpenClaw OAuth 凭证直接调用 ChatGPT/Codex Responses 的 image_generation 工具来生成或编辑光栅图像,然后保存
成功时终端输出类似:已保存: 20260601_福布斯2024中国内地富豪榜:钟睒睒连续4年成首富.md,文件内含标题、公众号名、作者、发布时间、原文链接、纯文本正文、HTML 片段、图片 URL 列表及外链。
实现批量下载:三步写死循环
第一步:新建一个 urls.txt 文件,每行一个公众号文章 URL,例如:
https://mp.weixin.qq.com/s/abc123https://mp.weixin.qq.com/s/def456https://mp.weixin.qq.com/s/ghi789
第二步:在同一目录下创建 batch-run.js,内容如下:
const fs = require('fs');const { execSync } = require('child_process');const urls = fs.readFileSync('urls.txt', 'utf8').trim().split('\n');urls.forEach((url, i) => { console.log(`[${i + 1}/${urls.length}] 正在处理: ${url}`); execSync(`node scripts/save-markdown.js "${url}"`, { stdio: 'inherit' });});
第三步:执行 node batch-run.js。脚本会逐条读取 URL 并调用抓取逻辑,每完成一篇就输出保存路径,全部结束后自动退出。
注意:Puppeteer 启动 Chrome 实例有开销,若目标 URL 超过 50 条,建议在 execSync 后加 setTimeout(() => {}, 2000) 防止页面加载竞争导致失败。
规避图片失效问题
生成的 Markdown 中图片链接默认是微信 CDN 地址,直接打开会 403 或过期。你必须额外配置图片下载与重写逻辑。
打开 scripts/scrape-wechat.js,定位到 const imgUrls = [...] 附近,在其后插入以下代码块:
const downloadAndRewriteImages = async (html, dirName) => { const $ = cheerio.load(html); const imgDir = path.join(__dirname, '..', 'images', dirName); if (!fs.existsSync(imgDir)) fs.mkdirSync(imgDir, { recursive: true }); let index = 0; for (const img of $('img')) { const src = $(img).attr('data-src') || $(img).attr('src'); if (!src) continue; const ext = path.extname(new URL(src).pathname) || '.jpg'; const fileName = `${dirName}_${String(index++).padStart(3, '0')}${ext}`; const localPath = path.join(imgDir, fileName); await pipeline(axios.get(src, { responseType: 'stream' }), fs.createWriteStream(localPath)); $(img).attr('src', `./images/${dirName}/${fileName}`); } return $.html();};
再找到最终返回 Markdown 的位置(通常在 return md 前),插入 const finalHtml = await downloadAndRewriteImages(htmlContent, slug); 并将 htmlContent 替换为 finalHtml。
这一步做完后,每次运行都会自动下载图片到 images/ 子目录,并将 Markdown 中的图片路径改为相对本地路径,双击即可离线查看完整图文。










