$npx -y skills add woodfishhhh/EZ_math_model --skill webcrawl网页抓取与开放检索。Jina Reader(免费零配置)+ Firecrawl + Tavily + Exa + SerpAPI。题目背景涉及行业 / 政策 / 经济时启用;纯数学 / 物理机理题不启用。
| 1 | # webcrawl — 网页抓取与开放检索 |
| 2 | |
| 3 | ## 何时使用 |
| 4 | |
| 5 | - 题目纯数学 / 物理机理 → **不要启用**。 |
| 6 | - 题目涉及行业 / 政策 / 地理 / 经济 → 启用。 |
| 7 | - 评价类题目需要业界基准 / 标准 → 启用。 |
| 8 | |
| 9 | ## 入口决策树 |
| 10 | |
| 11 | ``` |
| 12 | 有具体 URL 要读 → Jina Reader(免费,零配置) |
| 13 | 失败 → Firecrawl scrape(要 EZMM_FIRECRAWL_KEY) |
| 14 | 失败 → 让 LLM 用 WebFetch(最后兜底) |
| 15 | |
| 16 | 要先搜后读 → Tavily(要 EZMM_TAVILY_KEY) |
| 17 | / Exa(要 EZMM_EXA_KEY) |
| 18 | / SerpAPI(要 EZMM_SERPAPI_KEY) |
| 19 | 全部不可用 → 让用户给具体 URL,再走单页抓取 |
| 20 | ``` |
| 21 | |
| 22 | ## 命令模板 |
| 23 | |
| 24 | ### Jina Reader(免费) |
| 25 | |
| 26 | ```powershell |
| 27 | # 任意 URL → markdown,零配置 |
| 28 | $url = 'https://example.com/article' |
| 29 | Invoke-RestMethod -Uri "https://r.jina.ai/$url" -OutFile workdir/.../web/$(($url | Get-FileHash -Algorithm MD5).Hash.Substring(0,8)).md |
| 30 | ``` |
| 31 | |
| 32 | ### Firecrawl |
| 33 | |
| 34 | ```python |
| 35 | import requests, os |
| 36 | r = requests.post( |
| 37 | "https://api.firecrawl.dev/v1/scrape", |
| 38 | headers={"Authorization": f"Bearer {os.environ['EZMM_FIRECRAWL_KEY']}"}, |
| 39 | json={"url": "https://...", "formats": ["markdown"]}, |
| 40 | timeout=60, |
| 41 | ).json() |
| 42 | markdown = r["data"]["markdown"] |
| 43 | ``` |
| 44 | |
| 45 | ### Tavily / Exa / SerpAPI |
| 46 | |
| 47 | 参考 `tools/webcrawl/SKILL.md` 的代码段。 |
| 48 | |
| 49 | ## 落盘规范 |
| 50 | |
| 51 | 抓回的页面落到: |
| 52 | |
| 53 | ``` |
| 54 | workdir/{task_id}/attachments/external/web/<sha8>.md |
| 55 | ``` |
| 56 | |
| 57 | 文件头三行写: |
| 58 | |
| 59 | ``` |
| 60 | <!-- source: tavily | firecrawl | jina | exa | serp --> |
| 61 | <!-- fetched_at: 2026-05-20T10:00:00+08:00 --> |
| 62 | <!-- url: https://... --> |
| 63 | ``` |
| 64 | |
| 65 | ## 礼貌爬取 |
| 66 | |
| 67 | - 单源间隔 ≥ 1s |
| 68 | - 尊重 `robots.txt`(除非用户授权) |
| 69 | - 不绕过登录 / 反爬 |
| 70 | - 大批量爬取走 Firecrawl,不裸 requests |
| 71 | |
| 72 | ## 失败诊断 |
| 73 | |
| 74 | | 情况 | 处理 | |
| 75 | |---|---| |
| 76 | | 全部 key 缺失 | 仅 Jina 可用;写诊断说明可用工具集 | |
| 77 | | 单页 4xx / 5xx | 退避重试 1 次;仍失败记诊断 | |
| 78 | | 抓回登录墙 / 验证码 | 不绕过;写诊断 | |
| 79 | | 超时 > 60s | 中断,写诊断 | |