skills/dongbeixiaohuo/writing-agent/web-article-extractor

web-article-extractor

SKILL.md

Web Article Extractor

使用 Chrome DevTools MCP 服务器从网页中提取干净的文章内容,支持绕过常见的安全限制。

快速开始

前置条件

确保已配置 chrome-devtools MCP 服务器:

# 添加 chrome-devtools 服务器(带安全绕过参数)
claude mcp add chrome-devtools npx -y chrome-devtools-mcp@latest -- \
  --disable-blink-features=AutomationControlled \
  --disable-web-security \
  --disable-features=IsolateOrigins,site-per-process

基本使用流程

// 1. 获取标签页
const context = await tabs_context_mcp({ createIfEmpty: true });
const tabId = context.availableTabs[0].tabId;

// 2. 导航到目标页面
await navigate({ tabId, url: targetUrl });

// 3. 等待页面加载
await javascript_tool({
  tabId,
  action: "javascript_exec",
  text: `new Promise(r => {
    if (document.readyState === 'complete') r();
    else window.addEventListener('load', r);
  })`
});

// 4. 使用 Readability 提取(推荐)
const readabilityScript = await fs.readFile(
  '~/.claude/skills/web-article-extractor/scripts/readability_extractor.js',
  'utf8'
);

const result = await javascript_tool({
  tabId,
  action: "javascript_exec",
  text: readabilityScript
});

const article = JSON.parse(result);

微信公众号专用流程

微信公众号有多层安全防护,需要特殊处理:

完整提取脚本

async function extractWeChatArticle(articleUrl) {
  // 1. 连接到浏览器
  const tabs = await tabs_context_mcp({ createIfEmpty: true })
  const tabId = tabs.availableTabs[0].tabId

  // 2. 设置微信 User-Agent(关键步骤)
  await javascript_tool({
    tabId,
    action: "javascript_exec",
    text: `
      Object.defineProperty(navigator, 'userAgent', {
        get: () => 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.38(0x18002633) NetType/WIFI Language/zh_CN'
      });
      'User-Agent set to WeChat';
    `
  })

  // 3. 导航到文章页面
  await navigate({ tabId, url: articleUrl })

  // 4. 等待页面加载完成
  await javascript_tool({
    tabId,
    action: "javascript_exec",
    text: `
      await new Promise((resolve) => {
        const check = () => {
          const content = document.querySelector('#js_content, .rich_media_content')
          if (content && content.innerText.length > 100) {
            resolve()
          } else if (document.readyState === 'complete') {
            setTimeout(resolve, 2000)
          } else {
            setTimeout(check, 100)
          }
        }
        check()
      })
      'Content loaded';
    `
  })

  // 5. 提取文章内容
  const article = await javascript_tool({
    tabId,
    action: "javascript_exec",
    text: `
      (() => {
        const titleEl = document.querySelector('#activity-name, .rich_media_title')
        const title = titleEl ? titleEl.innerText.trim() : document.title

        const authorEl = document.querySelector('#js_name, .rich_media_meta_text')
        const author = authorEl ? authorEl.innerText.trim() : ''

        const dateEl = document.querySelector('#publish_time, .publish_time')
        const publishTime = dateEl ? dateEl.innerText.trim() : ''

        const contentEl = document.querySelector('#js_content, .rich_media_content')
        let content = ''
        if (contentEl) {
          const clone = contentEl.cloneNode(true)
          clone.querySelectorAll('script, style, noscript').forEach(el => el.remove())
          content = clone.innerText.trim()
        }

        const images = Array.from(document.querySelectorAll('#js_content img'))
          .map(img => img.getAttribute('data-src') || img.src)
          .filter(src => src && !src.includes('placeholder'))

        return JSON.stringify({
          title,
          author,
          publishTime,
          content,
          images,
          url: window.location.href,
          wordCount: content.length
        }, null, 2)
      })()
    `
  })

  return JSON.parse(article)
}

提取方法选择

本技能提供三种提取方法:

  1. Readability.js(推荐) - Mozilla 的成熟提取算法,处理复杂布局更准确

  2. 简化算法 - 自定义轻量级算法,速度更快但准确度稍低

    • 使用脚本:scripts/extract_article.js
  3. 自定义选择器 - 针对特定平台的选择器

输出格式

Markdown 格式

# 文章标题

**作者:** 作者名称
**发布时间:** 2024-01-15

文章正文内容...

---
来源:[链接](https://example.com)

JSON 格式

{
  "title": "文章标题",
  "author": "作者名称",
  "publishDate": "2024-01-15",
  "content": "完整文章内容...",
  "images": ["url1", "url2"],
  "metadata": {
    "url": "https://example.com/article",
    "wordCount": 1500,
    "readTime": 5
  }
}

进阶主题

常见问题

Q: 如何处理需要登录的内容?

A: 使用已登录的浏览器实例,或者在代码中实现登录流程。

Q: 微信文章显示"请在微信中打开"?

A: 需要设置微信 User-Agent(见上面的微信专用流程)。

Q: 如何提高提取成功率?

A: 使用最新版本的 Chrome DevTools MCP,设置正确的启动参数,模拟真实浏览器行为。

技术栈

  • Chrome DevTools MCP - 浏览器控制和页面操作
  • Readability.js v0.6.0 - Mozilla 文章提取算法
  • 自定义提取器 - 特殊网站支持(微信、知乎等)

版本更新

v2.0.0 (2025-12-28)

  • 升级 Readability.js 至 v0.6.0
  • 新增 isProbablyReaderable 快速预检测
  • 增强 SEO 元数据提取
  • 完善文档结构

v1.0.0 (2025-11-15)

  • 初始版本
  • 集成 Mozilla Readability.js
  • 支持微信公众号
Weekly Installs
38
GitHub Stars
110
First Seen
Jan 22, 2026
Installed on
opencode31
codex28
gemini-cli27
openclaw27
claude-code25
cursor24