基于Electron和Puppeteer实现AI网页内容自动读取
1. 项目背景与需求解析最近在开发AI Agent时遇到一个典型痛点如何让Claude直接读取浏览器中的网页内容这个问题看似简单实际操作却充满挑战。我最初尝试通过浏览器扩展直接获取页面内容但遇到了跨域限制、内容格式混乱等问题。经过多次尝试最终通过桌面版方案完美解决了这个需求。这个需求的核心价值在于当我们需要让AI处理网页信息时传统复制粘贴方式效率低下且容易丢失格式。而直接让Claude读取网页内容可以实现实时获取最新页面数据保持原始内容结构和格式实现自动化信息处理流程2. 技术方案选型与对比2.1 浏览器扩展方案的局限性最初尝试通过浏览器扩展实现具体方案是开发Chrome扩展注入内容脚本通过DOM API获取页面内容通过消息传递发送到后台脚本但实际测试发现以下问题跨域限制导致无法获取iframe内容动态加载内容难以完整捕获内容格式混乱需要大量清洗扩展权限申请流程复杂2.2 桌面版方案的突破点转向桌面版方案后技术路线调整为使用Electron构建跨平台应用集成Puppeteer实现无头浏览器功能通过本地服务桥接Claude API这个方案的优势在于完全控制浏览器环境绕过跨域限制支持完整页面截图可处理JavaScript渲染内容3. 详细实现步骤3.1 环境准备与依赖安装首先需要准备开发环境# 安装Node.js和npm brew install node # MacOS choco install nodejs # Windows # 创建项目目录 mkdir claude-webreader cd claude-webreader npm init -y # 安装核心依赖 npm install electron puppeteer dotenv3.2 主进程配置创建main.js作为Electron主入口const { app, BrowserWindow } require(electron) const path require(path) let mainWindow function createWindow() { mainWindow new BrowserWindow({ width: 1200, height: 800, webPreferences: { nodeIntegration: true, contextIsolation: false } }) mainWindow.loadFile(index.html) } app.whenReady().then(createWindow)3.3 网页内容获取实现使用Puppeteer的核心逻辑const puppeteer require(puppeteer) async function getPageContent(url) { const browser await puppeteer.launch() const page await browser.newPage() await page.goto(url, { waitUntil: networkidle2 }) // 获取纯净文本内容 const textContent await page.evaluate(() { return document.body.innerText }) // 获取完整HTML const htmlContent await page.content() await browser.close() return { textContent, htmlContent } }4. Claude API集成方案4.1 认证配置创建.env文件存储API密钥CLAUDE_API_KEYyour_api_key_here CLAUDE_API_VERSION2023-06-014.2 API调用封装实现Claude交互模块const axios require(axios) require(dotenv).config() async function queryClaude(prompt, content) { const response await axios.post( https://api.claude.ai/v1/completions, { prompt: ${prompt}\n\n${content}, max_tokens: 2000, temperature: 0.7 }, { headers: { Authorization: Bearer ${process.env.CLAUDE_API_KEY}, Content-Type: application/json } } ) return response.data.choices[0].text }5. 完整工作流实现5.1 用户界面设计创建renderer.js处理前端交互document.getElementById(fetch-btn).addEventListener(click, async () { const url document.getElementById(url-input).value const { textContent, htmlContent } await window.api.getPageContent(url) document.getElementById(output).value textContent const analysis await window.api.analyzeWithClaude( 请总结以下网页内容的核心要点, textContent ) document.getElementById(analysis).innerHTML analysis })5.2 进程间通信在preload.js中暴露APIconst { contextBridge, ipcRenderer } require(electron) contextBridge.exposeInMainWorld(api, { getPageContent: (url) ipcRenderer.invoke(get-page-content, url), analyzeWithClaude: (prompt, content) ipcRenderer.invoke(analyze-with-claude, prompt, content) })6. 打包与分发6.1 打包配置安装打包工具npm install electron-builder --save-dev配置package.json{ build: { appId: com.example.claudereader, win: { target: nsis }, mac: { target: dmg } } }6.2 构建命令执行打包npx electron-builder7. 实际应用案例7.1 新闻内容分析测试CNN首页新闻抓取输入https://edition.cnn.com自动提取主要新闻标题生成内容摘要识别关键实体人物、地点、组织7.2 技术文档处理处理GitHub文档页面的效果保持代码块格式完整正确解析Markdown结构提取API参数表格8. 性能优化技巧8.1 缓存策略实现本地缓存避免重复请求const cache new Map() async function getWithCache(url) { if(cache.has(url)) { return cache.get(url) } const content await getPageContent(url) cache.set(url, content) return content }8.2 并发控制限制同时打开的页面数量const { Semaphore } require(async-mutex) const semaphore new Semaphore(3) async function safeGetPage(url) { const [value, release] await semaphore.acquire() try { return await getPageContent(url) } finally { release() } }9. 安全注意事项重要处理用户提供的URL时务必注意验证URL格式防止SSRF攻击设置合理的超时限制使用沙箱环境执行不可信内容实现URL校验function isValidUrl(url) { try { new URL(url) return url.startsWith(http://) || url.startsWith(https://) } catch { return false } }10. 扩展可能性10.1 浏览器集成通过nativeMessaging实现与Chrome的深度集成注册本地消息主机处理浏览器扩展请求双向通信传递内容10.2 自动化工作流结合RPA场景定时监控页面变化价格追踪与提醒竞品内容分析这个方案从最初在浏览器扩展方案中受挫到最终通过桌面版完美实现整个过程让我深刻体会到技术选型的重要性。实际使用中发现对于需要深度控制浏览器环境的场景桌面应用确实提供了更灵活的实现空间。

相关新闻

RAG内存瓶颈破解:用Rust库turbovec实现向量索引8倍内存压缩

RAG内存瓶颈破解:用Rust库turbovec实现向量索引8倍内存压缩

1. 项目概述:当RAG遇上内存瓶颈最近在折腾一个私有化部署的RAG(检索增强生成)项目,场景很典型:企业内部知识库,文档量不小,有几十个GB的PDF、Word和内部系统导出的文本。最初的方案用的是基于Py…

2026/10/12 12:40:08 阅读更多 →
从数据到PPT:Python全流程实现趣味数据分析与自动化报告

从数据到PPT:Python全流程实现趣味数据分析与自动化报告

这次我们来看一个名为“大数据求偶bfb”的项目。从标题和有限的材料来看,这并非一个传统的开源AI模型或工具,而更像是一个结合了“大数据”概念与“求偶”主题的创意性演示或分析项目,其核心载体是一个简单的PPT。对于技术社区的读者而言&…

2026/10/13 1:22:56 阅读更多 →
鸿蒙跨端开发实战:分布式应用与UI适配解析

鸿蒙跨端开发实战:分布式应用与UI适配解析

1. 鸿蒙生态应用开发全景解析 鸿蒙操作系统作为新一代智能终端操作系统,正在经历从移动端向全场景的快速演进。我最近参与了一个跨端应用开发项目,深刻体会到鸿蒙生态下开发模式的变化。与传统的Android/iOS开发相比,鸿蒙的分布式能力让应用可…

2026/10/12 18:10:37 阅读更多 →

最新新闻

爆肝3天,开源AI原生截图神器:拓!可以塞进任何Agent使用~

爆肝3天,开源AI原生截图神器:拓!可以塞进任何Agent使用~

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 21:40:44 阅读更多 →
软件概要设计说明书:边界、结构、评审与维护实践

软件概要设计说明书:边界、结构、评审与维护实践

简介:这份软件概要设计说明书是软件工程中承上启下的核心文档,适合软件开发人员、项目管理者及计算机相关专业学生参考,用于在需求分析后明确系统架构与数据设计,为详细设计和编码提供蓝图。文档依次涵盖引言、范围界定、学生/教师…

2026/10/17 21:40:44 阅读更多 →
移动端游戏UI设计与动效实战:从适配规范到性能优化

移动端游戏UI设计与动效实战:从适配规范到性能优化

做移动端游戏 UI 和动效,和做 App 界面完全是两码事,这是我在几个项目里被毒打之后才真正想明白的结论。早些年我照着桌面端的设计规范做了一套游戏界面,结果一上真机,按钮点不到、字体发虚、动效掉帧,连着改了三版才勉…

2026/10/17 21:40:44 阅读更多 →
AI大模型应用开发工程师技术栈与入行指南:从Prompt到RAG的实战路径

AI大模型应用开发工程师技术栈与入行指南:从Prompt到RAG的实战路径

前阵子帮某位做后端开发的朋友改简历,他想转行做AI大模型应用开发工程师。我扫了两眼就直说:“你现在写的这些项目描述,面试官只会觉得你是个调接口的。”他当场愣住,因为市面上的教程就是这么教的——会调用一下大模型接口&#…

2026/10/17 21:40:44 阅读更多 →
Trae AI 插件进阶技巧:自定义 AI 模型与本地化部署的 TaoToken 统一接入实践

Trae AI 插件进阶技巧:自定义 AI 模型与本地化部署的 TaoToken 统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 21:40:44 阅读更多 →
算法习题答案背后的机制:递归、复杂度与工程避坑

算法习题答案背后的机制:递归、复杂度与工程避坑

简介:《数据结构与算法分析(Java语言描述)》第三版教材的配套习题答案文档,适合正在系统学习数据结构和算法、需要用习题检验自身理解的Java学习者与备考学生。文档覆盖文件处理与递归调用、递归算法设计(如求整数二进…

2026/10/17 21:39:43 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →