🔶 Launch HN:Context.dev (YC S26) – 从任意网站提取结构化数据的 API
英文标题:🔶 Launch HN: Context.dev (YC S26) – API to get structured data from any website
Context.dev 是一个 Y Combinator S26 批次的创业项目,提供 API 让开发者能够从任意网站中抽取结构化的 JSON 数据。只需定义 Zod schema,即可将页面内容转换为精确匹配的数据形状,无需编写爬虫或解析 HTML。该项目在 Hacker News 上获得 67 分和 51 条评论,显示出社区对这类结构化数据提取工具的兴趣。对于需要自动化采集竞品信息、价格监控或数据聚合的开发者来说,这大大降低了处理网站数据的技术门槛。
2.1 KB
2.9 KB
39.1 KB
4.0 KB
3.8 KB
4.2 KB
5.0 KB
29.1 KB
4.4 KB
1.9 KB
中文
🔶 Launch HN:Context.dev (YC S26) – 从任意网站提取结构化数据的 API
由 TheYahiaBakour 发布 · ⬆️ 67 pts · 💬 51 条评论
今天在 HN 上正式向社区介绍 Context.dev,我们是从 Y Combinator S26 批次毕业的创业团队。我们构建了一个 API,让你能够从任意网站中提取结构化的、类型安全的数据,而无需编写任何爬虫、解析器或处理混乱的 HTML。
核心思路非常简单:你只需要用 Zod(或其他 JSON Schema 工具)描述你期望的数据形状,然后调用我们的 /web/extract 端点,即可得到完美匹配 schema 的 JSON 结果。下面是一个完整的示例,演示如何抽取定价信息:
typescript import ContextDev from 'context.dev'; import { z } from 'zod';
const contextDevClient = new ContextDev({ apiKey: process.env['CONTEXT_DEV_API_KEY'] });
// 定义希望 Context.dev 从页面中提取的精确数据形状。 const schema = z.object({ company_name: z.string(), pricing_tiers: z.array( z.object({ tier_name: z.string(), tier_description: z.string(), tier_price: z.number(), tier_currency: z.string(), tier_billing_frequency: z.string(), tier_billing_model: z.enum(['monthly', 'yearly', 'one_time', 'usage_based']), }) ), });
// 将 Zod schema 转换为 JSON Schema,以供 /web/extract 使用。 const result = await contextDevClient.web.extract({ url: 'https://www.context.dev', schema: schema.toJSONSchema(), });
// result.data 现在严格匹配上面定义的 schema。 console.log(result.data.pricing_tiers);
为什么做这个?
过去几个月,我们和几十个团队交流,发现几乎所有人都在重复发明轮子:为每个目标网站写定制爬虫、用 LLM 做非结构化提取然后反复调整提示词、处理反爬和动态渲染。Context.dev 把这些复杂性全部抽象掉,只留下一行调用。
与纯 LLM 调用的区别
- 结构化保证:我们结合了浏览器渲染、智能解析和大型语言模型,但输出严格遵循你提供的 JSON Schema,不会产生多余的对话或格式错误。
- 规模优化:内置了请求队列、代理轮换和速率限制处理,适合生产环境。
- 类型安全:前端到后端都使用 Zod schema,TypeScript 开发者可以直接获得完整的类型推断。
反馈邀请
我们很期待听见社区的反馈!当前的 API 处于早期阶段,支持静态和动态渲染页面,也可以处理需要登录的页面(通过 session cookie)。你可以在 context.dev 注册免费试用,文档和更多示例都在那里。
请随意在评论区提问或分享你的使用场景,我们会一一回复。
欢迎在 Hacker News 阅读原始讨论(链接略,此处为示意)。
English / 原文
import ContextDev from 'context.dev'; import { z } from 'zod';
const contextDevClient = new ContextDev({ apiKey: process.env['CONTEXT_DEV_API_KEY'] });
// Define the exact shape Context.dev should extract from the page.
const schema = z.object({
company_name: z.string(),
pricing_tiers: z.array(
z.object({
tier_name: z.string(),
tier_description: z.string(),
tier_price: z.number(),
tier_currency: z.string(),
tier_billing_frequency: z.string(),
tier_billing_model: z.enum(['monthly', 'yearly', 'one_time', 'usage_based']),
})
),
});
// Convert the Zod schema to JSON Schema for /web/extract.
const result = await contextDevClient.web.extract({
url: 'https://www.context.dev',
schema: schema.toJSONSchema(),
});
// result.data now matches the schema above.
console.log(result.data.pricing_tiers);