HHY 扩展 · v1.1 已实现

HTML 扩展与抓取框架

用官方 HTML 扩展和 my-crawler 完成一次真实、可审计、有边界的静态页面采集。

为什么先做静态文档采集

HHY 已经拥有 HTTP、timeout、retry、parallel、结构化错误和原子文件输出。缺失的一环是 DOM 解析,所以第一版不把 Runtime 变成浏览器,而是增加一个无网络、无文件权限的 html 进程扩展:HHY 负责抓取与调度,Lexbor 负责解析不可信 HTML 和执行 CSS Selector。

构建与安装 HTML 扩展

sh
brew install jansson lexbor
make -C extensions/html
./build/hhy install ./extensions/html
./build/hhy list
Callable结果用途
html.text / text_allString / List读取一个或多个节点的规范化文本
html.attr / attr_allString / List读取一个或多个属性
html.existsBool判断 Selector 是否命中
html.extractList<Map>一次解析文档,并按 schema 投影重复记录

扩展把输入限制在 768 KiB,集合默认最多返回 1000 项、硬上限 10000 项,以便协议消息始终有界。它不返回 DOM handle:Protocol 1 只运输 JSON 可表达的值,因此 html.extract 在扩展内一次完成解析和字段投影。

初始化 my-crawler

sh
make
./practical-projects/my-crawler/init.sh
./practical-projects/my-crawler/self-test.sh
./practical-projects/my-crawler/run.sh

init.sh 把 html 扩展安装在项目自己的 .hhy-extensions 中,不污染用户级扩展目录,并创建被 Git 忽略的 output。self-test.sh 使用本机 fixture server 验证完整 HTTP → DOM → JSON 链路;run.sh 默认执行真实的 hhylang.dev 文档抓取。

config/hhylang.json
{
  "seeds": ["https://hhylang.dev/zh/learn/cli-reference"],
  "parallelism": 2,
  "root_selector": "main article h2",
  "max_results": 100,
  "schema": {
    "title": { "selector": "", "value": "text" },
    "anchor": { "selector": "", "value": "attr", "name": "id" }
  }
}

真实运行结果与边界

实际运行结果
$./practical-projects/my-crawler/run.sh
HHY Collector Framework HHY Documentation Crawler
Pages 1 / 1 Records 6 Failures 0
Records practical-projects/my-crawler/output/records.json
Report practical-projects/my-crawler/output/report.json
职责
Crawler种子去重、有界并发、timeout/retry、逐页失败归档
HTML extensionLexbor DOM、CSS Selector、文本/属性/schema 抽取
Outputrecords、report、failures 三份原子 JSON
当前边界响应体完整缓冲;不支持 JS 渲染、浏览器自动化和无限流
查看 my-crawler 完整源码包含中英文说明、真实任务配置、初始化脚本、本机 fixture server 和确定性端到端测试。