适用场景
网页正文提取API的目标是从新闻、博客、公众号等网页中精准抽取主体正文,自动去除导航栏、侧边栏、广告和评论等无关元素。它基于文本密度算法,同时返回标题、发布时间、配图列表、字数与预估阅读时长。在内容聚合、数据采集、RSS构建、文章摘要生成等场景中,这是一个高效的工具。
但任何API都有其调用边界,理解这些限制是稳定集成的前提。本文将聚焦于该接口的请求频率限制(QPS)、参数校验、错误处理以及工程化实践中的注意事项。
接口能力边界
QPS限制
根据官方文档,该接口的QPS(每秒查询数)为5。这意味着单个API Key在1秒内最多只能发起5次请求。超出此限制后,服务端会返回HTTP 429(Too Many Requests)状态码,并可能附带限流提示。开发者必须遵守这一限制,否则请求将被拒绝。
其他潜在限制
- 每日调用总量:文档未明确给出每日上限,建议以实际文档或账户状态为准。如果需要大量提取,应自行控制速率。
- URL长度:可能存在隐式限制(如URL超过2048字符可能导致失败),建议对过长URL进行编码或缩短。
- 响应大小:返回的content字段可能包含较大文本,需考虑内存占用。
请求参数与鉴权
请求方法
- GET
- 接口地址:
https://v1.apizero.cn/api/content-extract
必填参数
| 参数名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
| url | string | 是 | 目标网页的完整URL,需URL编码 |
鉴权方式
通过请求头传入API Key:
- Header名:
X-API-Key - 值:你的API密钥(通常需在平台申请)
curl请求示例
以下是一个可复制的curl请求示例(请将$APIZERO_API_KEY替换为你的实际密钥):
curl -sS \ -X GET \ -H "X-API-Key: $APIZERO_API_KEY" \ "https://v1.apizero.cn/api/content-extract?url=https://example.com/article"若请求成功,返回将是一个JSON对象数组(示例中仅含一个对象)。
响应字段解读
成功响应(HTTP 200)的JSON结构如下(单个元素):
{ "code": 0, "msg": "成功", "data": { "content": "提取后的正文内容(HTML或纯文本)", "title": "网页标题", "publish_time": "2024-01-15", "image_count": 3, "images": [ "https://example.com/image1.jpg", "https://example.com/image2.jpg", "https://example.com/image3.jpg" ], "word_count": 2300, "reading_time": "5分钟" } }字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功,非0表示错误 |
| msg | string | 结果描述 |
| data.content | string | 提取后的正文,通常已去除无关元素 |
| data.title | string | 网页的标题文本 |
| data.publish_time | string | 页面发布时间(可能缺失) |
| data.image_count | int | 正文中配图的数量 |
| data.images | string[] | 配图的URL列表 |
| data.word_count | int | 正文字数(含标点) |
| data.reading_time | string | 按中文阅读速度估算的时长,如“5分钟” |
注意:部分字段可能缺失(如publish_time在动态页面中无法提取时),代码应做防御性判断。
调用限制与用量边界详解
QPS 5/s 的工程含义
- 并发限制:不能在一秒内连续发送超过5个请求。例如,使用5个线程各发1个请求或单线程5次循环都需控制在1秒后。
- 实际测试:如果每秒发送6个请求,第6个请求将收到HTTP 429响应。429响应体可能为:
(具体由服务端实现决定){ "code": 429, "msg": "请求过于频繁,请稍后再试" }
限流应对策略
- 请求节流:使用令牌桶算法或简单的队列+延迟。例如,每200ms发送一个请求(1/0.2=5)。
- 重试机制:遇到429时,等待1秒后重试(Retry-After头可参考)。建议最大重试3次,指数退避。
- 缓存结果:对于同一个URL,提取结果在短时间内不会变化(除非原网页更新)。可设置缓存(如内存或Redis)TTL为几小时,减少重复请求。
其他用量边界
- URL有效性:如果URL不可访问(404、503等),API会返回错误码,请求依然计入调用量。
- 内容可提取性:某些网页使用JavaScript动态渲染,而该API可能只抓取静态HTML,提取结果为空白或错误。应在代码中检查content的长度。
- 数据量:一次请求返回的content大小可能很大(例如数万字),需注意HTTP传输时间和程序处理压力。
常见错误与处理
| 错误情况 | 状态码 | 可能原因 | 处理建议 |
|---|---|---|---|
| 400 Bad Request | 400 | 缺少url参数或格式错误 | 检查参数名和URL编码 |
| 401 Unauthorized | 401 | API Key无效或缺失 | 验证Key是否正确,是否过期 |
| 429 Too Many Requests | 429 | 超过QPS限制 | 降低请求频率,加入重试逻辑 |
| 500 Internal Server Error | 500 | 服务端临时故障 | 等待后重试,联系技术支持 |
| 提取失败(code非0) | 200但code>0 | 目标网页无内容或解析错误 | 检查msg字段,确认URL可访问 |
错误响应示例
{ "code": 1001, "msg": "URL格式不正确" }处理时,应优先检查HTTP状态码;当状态码为200时,再判断code字段。
工程化注意事项
1. 并发控制
使用信号量或速率限制器(如Python的asyncio.Semaphore或rate-limiter)确保每秒不超过5个请求。例如:
import time import requests def rate_limited_request(url, api_key): # 简单实现:每次调用后休眠0.2秒 response = requests.get( 'https://v1.apizero.cn/api/content-extract', params={'url': url}, headers={'X-API-Key': api_key} ) time.sleep(0.2) # 5 QPS => 间隔200ms return response2. 超时与重试
设置合理的超时(如连接5秒,读取15秒)。对于429或5xx错误,使用指数退避重试(初始等待0.5秒,每次加倍,最多3次)。
3. 结果缓存
使用缓存键(如URL的哈希)存储提取结果。示例(Python):
cache = {} # 建议使用TTL字典 def get_extracted(url): if url in cache: return cache[url] result = call_api(url) cache[url] = result return result注意:缓存需考虑原网页更新频率,避免提供过期数据。
4. 错误日志与监控
记录每次请求的URL、状态码、耗时、错误信息。对于持续出错的URL,可加入黑名单或报警。
5. URL预处理
- 对URL进行编码:包含中文或特殊字符的URL需先做百分号编码。
- 移除#锚点部分,避免干扰。
- 检查URL是否以http/https开头,否则拒绝。
参考文档
- 原始API文档:https://apizero.cn/aidocs/content-extract/raw.md
- 在线文档页:https://apizero.cn/aidocs/content-extract
(以上链接仅供参考,请以实际发布的文档为准。)