抓取文章Skill scrape-posts

此技能用于从Milan Jovanovic的.NET博客优化抓取新文章,通过预筛选列表页面,仅抓取新增或更新的内容,以减少API请求并提升效率。关键词:博客抓取、数据自动化、内容管理、SEO优化、网络爬虫、节省成本。

数据工程 1 次安装 2 次浏览 更新于 3/11/2026

名称: 抓取文章 描述: 从Milan Jovanovic的.NET博客(2025年11月及以后)抓取新文章。优化 - 从列表页面预筛选,只抓取新文章。 参数提示: [–force] [–since YYYY-MM-DD] [–limit N] [–dry-run] 允许工具: Read, Bash, Skill, mcp__firecrawl__firecrawl_scrape, mcp__firecrawl__firecrawl_map, mcp__firecrawl__firecrawl_search

抓取Milan Jovanovic博客文章

从Milan Jovanovic的.NET博客抓取新文章,使用优化的预筛选。解析列表页面中的日期,避免不必要的每篇文章抓取。

参数

  • --force: 重新抓取所有文章(比较内容哈希以跳过未更改的)
  • --since YYYY-MM-DD: 自定义日期过滤器(默认:2025-11-01)
  • --limit N: 限制文章数量(用于测试)
  • --dry-run: 预览将要抓取的内容而不保存

优化工作流程

步骤 1: 调用技能

调用milan-jovanovic:milan-jovanovic-blog技能以加载上下文并访问脚本。

步骤 2: 从列表页面预筛选(优化)

关键效率优化: 在抓取单篇文章之前从列表页面解析日期。

  1. 使用firecrawl_scrape抓取博客列表页面:

    URL: https://www.milanjovanovic.tech/blog
    格式: markdown
    
  2. 将列表内容保存到临时文件(例如,.claude/temp/milan-listing.md

  3. 运行预筛选脚本以识别需要抓取的文章:

    # 正常模式 - 仅新文章
    python scripts/core/check_new_articles.py .claude/temp/milan-listing.md --json --since 2025-11-01
    
    # 强制模式 - 包括现有以重新检查
    python scripts/core/check_new_articles.py .claude/temp/milan-listing.md --json --force --since 2025-11-01
    
  4. 解析JSON输出以获取to_scrape列表。如果为空,跳到步骤5(无需抓取)。

步骤 3: 仅抓取需要的文章

对于to_scrape中的每篇文章:

  1. 对于in_index: false的文章(新):

    • 使用firecrawl_scrape抓取完整文章
    • 从元数据中提取发布日期
    • 清理促销内容
    • 保存到canonical/milanjovanovic-tech/blog/{slug}.md
  2. 对于in_index: true的文章(强制模式重新检查):

    • 使用firecrawl_scrape抓取完整文章
    • 清理促销内容
    • 生成内容哈希
    • 与预筛选输出中的content_hash比较
    • 如果未更改,跳过写入(记录为“跳过 - 未更改”)
    • 如果更改,保存更新后的内容

步骤 4: 更新索引

抓取完成后:

python scripts/management/refresh_index.py

步骤 5: 报告统计

报告:

  • 列表页面找到的文章数
  • 需要抓取的文章数(新 + 强制重新检查)
  • 跳过的文章数(已索引,不在强制模式)
  • 跳过的文章数(内容哈希未更改,强制模式)
  • 过滤的文章数(在截止日期前)
  • 任何错误

内容清理模式

抓取器移除这些促销模式:

页脚模式(停止处理):

  • “Whenever you’re ready, there are X ways I can help you”
  • “Become a Better .NET Software Engineer”
  • “Hi, I’m Milan”

赞助商模式(移除部分):

  • AuthKit/WorkOS提及
  • “Sponsor this newsletter”链接
  • 事件响应赞助内容

内联模式(移除):

  • 阅读时间(“5 min read”)
  • “Manage read history”链接
  • 空图片占位符

效率提升

场景 无优化 有优化
无新文章 10+ firecrawl请求 1-2请求
1篇新文章 10+ firecrawl请求 2-3请求
强制(未更改) 10+请求 10+请求但跳过写入

为什么这重要: Firecrawl有API成本和速率限制。预筛选在文章未更改时节省80-90%的请求。

使用示例

/milan-jovanovic:scrape-posts
/milan-jovanovic:scrape-posts --limit 3 --dry-run
/milan-jovanovic:scrape-posts --force
/milan-jovanovic:scrape-posts --since 2025-12-01

故障排除

Firecrawl不可用

如果firecrawl MCP未连接,命令将失败。确保firecrawl MCP服务器配置并运行。

日期解析问题

如果列表页面日期无法解析,脚本在no_date类别中记录它们。除非提供特定URL,否则这些文章被跳过。

预筛选显示0篇文章

如果check_new_articles.py显示0篇文章需要抓取:

  • 所有文章已索引(使用--force重新检查)
  • 所有文章在截止日期前(调整--since
  • 列表页面格式更改(检查脚本中的正则表达式模式)