Skip to content

页面密度

POST /v3/on_page/keyword_density

接口说明

POST /v3/on_page/keyword_density

本接口用于获取指定网站或网页中的密度与出现频次。你可以按长度筛选,并对返回结果进行过滤和排序。

使用本接口前,请确保在创建任务时将 calculate_keyword_density 参数设置为 true。任务创建完成后,使用任务 ID 查询密度结果。

计费说明

本接口当前不额外收取查询费用,任务结果可在任务创建后的 30 天获取。响应中的 cost 通常为 0

扣费以响应头 X-SeerMarTech-Charge-CNY 为准。

请求格式

所有 POST 请求均须使用 UTF-8 编码的 JSON 格式,请求体为 JSON 数组:

json
[
  {
    "id": "07131248-1535-0216-1000-17384017ad04",
    "keyword_length": 2
  }
]

请求参数

参数类型说明
idstring任务 ID。该 ID 来自 /v3/on_page/task_post 接口的响应。示例:07131248-1535-0216-1000-17384017ad04
keyword_lengthinteger的单词数量。可选值:12345
urlstring要分析的网页 URL。使用绝对 URL,并 http://https://。如果不提供,则分析整个网站;提供后,结果该网页中的
limitinteger返回的最大数量。默认值为 100,最大值为 1000
filtersarray结果过滤条件数组。最多设置 8 个过滤条件,多个条件之间指定逻辑运算符 andor
order_byarray结果排序规则。最多设置 3 条排序规则,可使用与 filters 相同的字段和运算符
tagstring自定义任务标识,最长 255 个字符。可用于任务与结果,指定的值会原样返回在响应的 data 对象中

filters 过滤条件

支持以下运算符:

  • regex
  • not_regex
  • =
  • <>
  • in
  • not_in
  • like
  • not_like

使用 likenot_like 时,可以使用 % 匹任意长度的字符串空字符串。

过滤条件示例:

json
[
  ["frequency", ">", 5],
  "and",
  ["keyword", "like", "%seo%"]
]

完整的过滤字段与条件说明,请参考过滤器和阈值文档。

order_by 排序规则

排序方向支持:

  • asc:升序
  • desc:降序

排序规则通常以字段名和排序方向组成,例如:

json
[
  "frequency,desc",
  "density,desc"
]

单个请求最多设置 3 条排序规则,多条规则之间使用逗号分隔。

请求示例

cURL

bash
curl --location --request POST \
  "https://api.seermartech.cn/v3/on_page/keyword_density" \
  --header "Authorization: Bearer smt_live_YOUR_KEY" \
  --header "Content-Type: application/json" \
  --data-raw '[
    {
      "id": "09101923-1535-0216-0000-2389a8854b70",
      "url": "https://example.com/",
      "keyword_length": 2,
      "limit": 100,
      "filters": [
        ["frequency", ">", 5]
      ],
      "order_by": [
        "frequency,desc"
      ],
      "tag": "homepage-bigrams"
    }
  ]'

Python

python
import requests

url = "https://api.seermartech.cn/v3/on_page/keyword_density"

headers = {
    "Authorization": "Bearer smt_live_YOUR_KEY",
    "Content-Type": "application/json",
}

payload = [
    {
        "id": "09101923-1535-0216-0000-2389a8854b70",
        "url": "https://example.com/",
        "keyword_length": 2,
        "filters": [
            ["frequency", ">", 5]
        ],
    }
]

response = requests.post(url, headers=headers, json=payload)

if response.status_code == 200:
    result = response.json()
    print(result)
else:
    print("HTTP 错误:", response.status_code, response.text)

TypeScript

typescript
import axios from "axios";

const payload = [
  {
    id: "09101923-1535-0216-0000-2389a8854b70",
    url: "https://example.com/",
    keyword_length: 2,
    filters: [
      ["frequency", ">", 5],
    ],
    order_by: [
      "frequency,desc",
    ],
  },
];

axios({
  method: "post",
  url: "https://api.seermartech.cn/v3/on_page/keyword_density",
  headers: {
    Authorization: "Bearer smt_live_YOUR_KEY",
    "Content-Type": "application/json",
  },
  data: payload,
})
  .then((response) => {
    // 处理接口返回结果
    console.log(response.data);
  })
  .catch((error) => {
    console.error("请求失败:", error.response?.data || error.message);
  });

响应结构

接口返回 JSON 数据 tasks 数组。

json
{
  "version": "0.1.20210907",
  "status_code": 20000,
  "status_message": "Ok.",
  "time": "0.2239 sec.",
  "cost": 0,
  "tasks_count": 1,
  "tasks_error": 0,
  "tasks": [
    {
      "id": "09101923-1535-0216-0000-2389a8854b70",
      "status_code": 20000,
      "status_message": "Ok.",
      "time": "0.2000 sec.",
      "cost": 0,
      "result_count": 1,
      "path": [
        "v3",
        "on_page",
        "keyword_density"
      ],
      "data": {
        "api": "on_page",
        "function": "keyword_density",
        "url": "https://example.com/",
        "keyword_length": 2,
        "limit": 100,
        "order_by": [
          "frequency,desc"
        ],
        "filters": [
          ["frequency", ">", 5]
        ],
        "target": "example.com",
        "max_crawl_pages": 10,
        "calculate_keyword_density": true
      },
      "result": [
        {
          "crawl_progress": "finished",
          "crawl_status": {
            "max_crawl_pages": 10,
            "pages_in_queue": 0,
            "pages_crawled": 1
          },
          "total_items_count": 2,
          "items_count": 2,
          "items": [
            {
              "keyword": "technical seo",
              "frequency": 8,
              "density": 12
            },
            {
              "keyword": "seo audit",
              "frequency": 6,
              "density": 9
            }
          ]
        }
      ]
    }
  ]
}

响应字段

顶层字段

字段类型说明
versionstring当前 API 版本
status_codeinteger局状态码。20000 表示请求成功,状态码请根据错误码处理
status_messagestring局提示信息
timestring请求执行耗时,单位为秒
costfloat平台原始 USD 成本兼容字段;人民币实扣以 X-SeerMarTech-Charge-CNY 为准。
tasks_countintegertasks 数组中的任务总数
tasks_errorintegertasks 数组中返回错误的任务数量
tasksarray任务结果数组

tasks 任务字段

字段类型说明
idstring任务唯一标识,采用 UUID 格式
status_codeinteger任务状态码,通常在 1000060000 范围
status_messagestring任务状态说明
timestring任务执行耗时,单位为秒
costfloat平台原始 USD 成本兼容字段;人民币实扣以 X-SeerMarTech-Charge-CNY 为准。
result_countintegerresult 数组中的数量
patharray请求对应的 URL 路径
dataobject创建任务时提交的参数及任务信息
resultarray密度分析结果

result 结果字段

字段类型说明
crawl_progressstring抓取会话状态。可选值:in_progressfinished
crawl_statusobject抓取会话的详细状态
total_items_countinteger符合指定 keyword_lengthfilters 条件的总数
items_countinteger当前 items 数组中的数量
itemsarray结果数组

crawl_status 字段

字段类型说明
max_crawl_pagesinteger最大抓取页面数,对应任务设置中的 max_crawl_pages
pages_in_queueinteger当前仍在抓取队列中的页面数量
pages_crawledinteger已完成抓取的页面数量

items 字段

字段类型说明
keywordstring返回的
frequencyinteger出现次数。如果请求中指定了 url,则表示该在指定网页中的出现次数;否则表示在整个网站中的出现次数
densityinteger密度,按该的 frequency 除以指定长度下的总数计算

状态码与错误处理

请根据响应中的 status_codestatus_message 判断请求是否成功。建议在业务系统中处理以下:

  • 顶层 status_code20000
  • 单个任务的 status_code20000
  • crawl_progressin_progress,表示抓取尚未完成
  • tasks_error 大于 0
  • 请求时、认证失败或参数校验失败

完整错误码请参考错误码文档。

实用场景

  • 识别页面核心:统计目标页面中不同长度的出现频次与密度,提炼页面主题和重点。
  • 检查优化效果:对比优化前后的频率和密度,评估 SEO调整是否真正提升了主题性。
  • 发现堆砌风险:筛选高频并检查密度,及时降低过度重复带来的质量和搜索引擎风险。
  • 对比网站与单页主题覆盖:分别分析整个网站和指定网页,定位站点级主题与页面级主题之间的偏差。
  • 构建竞品分析报告:抓取竞品网站的高频词组并按频次排序,为规划、标题设计和链接布局提供依据。

统一入口:官网 · LLM API · 控制台