名称: 抓取文章 描述: 从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: 从列表页面预筛选(优化)
关键效率优化: 在抓取单篇文章之前从列表页面解析日期。
-
使用
firecrawl_scrape抓取博客列表页面:URL: https://www.milanjovanovic.tech/blog 格式: markdown -
将列表内容保存到临时文件(例如,
.claude/temp/milan-listing.md) -
运行预筛选脚本以识别需要抓取的文章:
# 正常模式 - 仅新文章 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 -
解析JSON输出以获取
to_scrape列表。如果为空,跳到步骤5(无需抓取)。
步骤 3: 仅抓取需要的文章
对于to_scrape中的每篇文章:
-
对于
in_index: false的文章(新):- 使用
firecrawl_scrape抓取完整文章 - 从元数据中提取发布日期
- 清理促销内容
- 保存到
canonical/milanjovanovic-tech/blog/{slug}.md
- 使用
-
对于
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) - 列表页面格式更改(检查脚本中的正则表达式模式)