主题
OnPage 重复标题与描述标签
POST /v3/on_page/duplicate_tags
本接口使用 POST 方法,路径为 /v3/on_page/duplicate_tags:
text
POST https://api.seermartech.cn/v3/on_page/duplicate_tags用于查询网站中重复 title 或 description 标签的页面,同时返回页面性能、质量、技术 SEO 检查及抓取状态等数据。
计费说明
本接口当前不产生额外费用。任务结果可在创建任务后的 30 天获取。
扣费以响应头 X-SeerMarTech-Charge-CNY 为准。
请求说明
请求体使用 UTF-8 编码的 JSON 数组格式:
json
[
{
"id": "07131248-1535-0216-1000-17384017ad04",
"type": "duplicate_description",
"limit": 10
}
],id 为通过 OnPage 任务创建接口获取的任务 ID。
请求参数
| 参数 | 类型 | 填 | 说明 |
|---|---|---|---|
id | string | 是 | OnPage 抓取任务 ID,可从任务创建接口的响应中获取。示例:07131248-1535-0216-1000-17384017ad04 |
type | string | 是 | 重复标签类型。可选值:duplicate_title、duplicate_description。结果将根据该参数返回重复标题或重复描述页面。 |
accumulator | string | 否 | 指定要匹的标题或描述返回该标签值的重复页面。 |
limit | integer | 否 | 最多返回的页面数。默认值:100;最大值:1000。 |
offset | integer | 否 | 结果偏移量,默认值:0;最大值:2000000。例如设置为 10 时,跳过前 10 条结果并返回后续页面。 |
tag | string | 否 | 自定义任务标识,用于识别任务并匹结果,最长 255 个字符。指定的值会在响应的 data 对象中返回。 |
响应结构
响应为 JSON 对象,主要 tasks 数组。
顶层响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
version | string | 当前 API 版本。 |
status_code | integer | 通用响应状态码。成功通常为 20000。完整状态码请参考错误码文档。 |
status_message | string | 通用状态消息。 |
time | string | 接口执行耗时,单位为秒。 |
cost | float | 平台原始 USD 成本兼容字段;人民币实扣以 X-SeerMarTech-Charge-CNY 为准。 |
tasks_count | integer | tasks 数组中的任务数量。 |
tasks_error | integer | tasks 数组中返回错误的任务数量。 |
tasks | array | 任务结果数组。 |
任务字段
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 系统中的任务唯一标识,UUID 格式。 |
status_code | integer | 任务状态码,通常在 10000 至 60000 范围。 |
status_message | string | 任务状态消息。 |
time | string | 任务执行耗时。 |
cost | float | 平台原始 USD 成本兼容字段;人民币实扣以 X-SeerMarTech-Charge-CNY 为准。 |
result_count | integer | result 数组中的结果数量。 |
path | array | URL 路径信息。 |
data | object | 创建任务时提交的参数。 |
result | array | 任务结果数组。 |
结果字段
抓取状态
| 字段 | 类型 | 说明 |
|---|---|---|
crawl_progress | string | 抓取状态,可选值:in_progress、finished。 |
crawl_status | object | 抓取会话。 |
crawl_status.max_crawl_pages | integer | 创建任务时指定的最大抓取页数。 |
crawl_status.pages_in_queue | integer | 当前抓取队列中的页面数。 |
crawl_status.pages_crawled | integer | 已抓取页面数。 |
crawl_status.total_pages_count | integer | 目标网站中重复标签的页面总数。 |
crawl_status.pages_count | integer | 本次响应返回的重复标签页面数。 |
items_count | integer | items 数组中的数量。 |
items | array | 按重复标签值聚合的结果。 |
items[].accumulator | string | 重复标签的。 |
items[].total_count | integer | 含该重复标签的页面总数。 |
items[].pages | array | 含重复标签的页面列表。 |
页面基础信息
| 字段 | 类型 | 说明 |
|---|---|---|
resource_type | string | 返回资源类型,固定为 html。 |
status_code | integer | 页面 HTTP 状态码。 |
location | string | Location 响应头,表示页面重定向目标 URL。 |
url | string | 页面 URL。 |
meta | object | 页面数据及页面属性。 |
meta.title | string | 页面标题。 |
meta.charset | integer | 页面编码,例如 65001。 |
meta.follow | boolean | meta robots 是否爬虫跟踪页面链接。为 false 时表示 nofollow。 |
meta.generator | string | generator标签。 |
meta.htags | object | HTML 标题标签信息。 |
meta.description | string | description标签。 |
meta.favicon | string | 页面 favicon 地址。 |
meta.meta_keywords | string | keywords标签。 |
meta.canonical | string | 页面规范 URL。 |
meta.internal_links_count | integer | 页面链接数。 |
meta.external_links_count | integer | 页面外部链接数。 |
meta.inbound_links_count | integer | 指向该页面的链接数。 |
meta.images_count | integer | 页面图片数量。 |
meta.images_size | integer | 页面图片总大小,单位为字节。 |
meta.scripts_count | integer | 页面脚本数量。 |
meta.scripts_size | integer | 页面脚本总大小,单位为字节。 |
meta.stylesheets_count | integer | 页面样式表数量。 |
meta.stylesheets_size | integer | 页面样式表总大小,单位为字节。 |
meta.title_length | integer | title 标签字符数。 |
meta.description_length | integer | description 标签字符数。 |
meta.render_blocking_scripts_count | integer | 阻塞页面渲染的脚本数量。 |
meta.render_blocking_stylesheets_count | integer | 阻塞页面渲染的样式表数量。 |
meta.cumulative_layout_shift | float | 累积布局偏移(CLS),用于衡量页面布局稳定性。 |
###信息 content
| 字段 | 类型 | 说明 |
|---|---|---|
content.plain_text_size | integer | 页面纯文本总大小,单位为字节。 |
content.plain_text_rate | integer | 纯文本占页面大小的比例,即 plain_text_size / size。 |
content.plain_text_word_count | float | 页面词数。 |
content.automated_readability_index | float | 自动可读性指数。 |
content.coleman_liau_readability_index | float | Coleman-Liau 可读性指数。 |
content.dale_chall_readability_index | float | Dale-Chall 可读性指数。 |
content.flesch_kincaid_readability_index | float | Flesch-Kincaid 可读性指数。 |
content.smog_readability_index | float | SMOG 可读性指数。 |
content.description_to_content_consistency | float | description 与页面正文的一致性,取值范围为 0 至 1。 |
content.title_to_content_consistency | float | title 与页面正文的一致性,取值范围为 0 至 1。 |
content.meta_keywords_to_content_consistency | float | keywords 与页面正文的一致性,取值范围为 0 至 1。 |
content.deprecated_tags | array | 页面中的废弃 HTML 标签。 |
content.duplicate_meta_tags | array | 页面中的重复标签。 |
content.spell | object | 拼写检查结果。 |
content.spell.hunspell_language_code | string | 拼写检查语言代码。 |
content.spell.misspelled | array | 拼写错误单词列表。 |
content.spell.misspelled[].word | string | 拼写错误的单词。 |
content.resource_errors | object | 资源错误与警告。 |
content.resource_errors.errors | array | HTML 资源错误。 |
content.resource_errors.errors[].line | integer | 发现错误的行号。 |
content.resource_errors.errors[].message | string | 错误信息。 |
content.resource_errors.warnings | array | HTML 资源警告。 |
content.resource_errors.warnings[].line | integer | 警告对应的行号;为 0 时表示警告针对整个页面。 |
content.resource_errors.warnings[].message | string | 警告信息。 |
content.social_media_tags | object | 页面中发现的社交媒体标签及, Open Graph、Twitter Card 等标签。 |
常见 HTML 结构警告:
Has node with more than 60 childs.:存在同一层级嵌套 60 个子节点的标签。Has more that 1500 nodes.:DOM 树 1500 个。HTML depth more than 32 tags.:HTML 嵌套深度 32 层。
页面加载指标 page_timing
| 字段 | 类型 | 说明 |
|---|---|---|
time_to_interactive | integer | 可交互时间(TTI),单位为毫秒。 |
dom_complete | integer | 页面及子资源下载完成所需时间,单位为毫秒。 |
largest_contentful_paint | float | 最大绘制(LCP),单位为毫秒。 |
first_input_delay | float | 首次延迟(FID),单位为毫秒。 |
connection_time | integer | 与服务器建立连接所需时间,单位为毫秒。 |
time_to_secure_connection | integer | 建立连接所需时间,单位为毫秒。 |
request_sent_time | integer | 请求发送所需时间,单位为毫秒。 |
waiting_time | integer | 首字节时间(TTFB),单位为毫秒。 |
download_time | integer | 浏览器接收响应所需时间,单位为毫秒。 |
duration_time | integer | 浏览器接收完整响应所需总时间,单位为毫秒。 |
fetch_start | integer | 开始下载 HTML 资源的时间,单位为毫秒。 |
fetch_end | integer | 完成下载 HTML 资源的时间,单位为毫秒。 |
页面性能与资源字段
| 字段 | 类型 | 说明 |
|---|---|---|
onpage_score | float | 页面 OnPage 优化得分,满分为 100。 |
total_dom_size | integer | 页面 DOM 总大小。 |
custom_js_response | string / object / integer | 执行自定义 JavaScript 后的结果。只有创建任务时指定 custom_js 才会返回,类型取决于脚本。 |
custom_js_client_exception | string | 执行自定义 JavaScript 时产生的错误信息。 |
broken_resources | boolean | 页面是否损坏资源。 |
broken_links | boolean | 页面是否失效链接。 |
duplicate_title | boolean | 页面是否存在重复 title 标签。 |
duplicate_description | boolean | 页面是否存在重复 description 标签。 |
duplicate_content | boolean | 页面是否存在重复。 |
click_depth | integer | 从首页点击到达该页面所需的点击层级。 |
size | integer | 页面资源大小,单位为字节。 |
encoded_size | integer | 页面编码后的大小,单位为字节。 |
total_transfer_size | integer | 页面压缩后的传输大小,单位为字节。 |
fetch_time | string | 资源抓取时间,UTC 格式:yyyy-mm-dd hh-mm-ss +00:00。 |
content_encoding | string | 编码类型。 |
media_type | string | 页面使用的媒体类型。 |
server | string | 服务器版本。 |
is_resource | boolean | 是否为单一资源。 |
缓存信息 cache_control
| 字段 | 类型 | 说明 |
|---|---|---|
cache_control.cachable | boolean | 页面是否可缓存。 |
cache_control.ttl | integer | 缓存生存时间,单位通常为秒。 |
页面检查结果 checks
| 字段 | 类型 | 说明 |
|---|---|---|
no_content_encoding | boolean | 页面是否未使用压缩编码。 |
high_loading_time | boolean | 页面加载时间是否 3 秒。 |
is_redirect | boolean | 页面是否发生 3XX 重定向。 |
is_4xx_code | boolean | 页面是否返回 4xx 状态码。 |
is_5xx_code | boolean | 页面是否返回 5xx 状态码。 |
is_broken | boolean | 页面是否损坏,即响应码小于 200 或大于 400。 |
is_www | boolean | 页面是否位于 www 子域名。 |
is_https | boolean | 页面是否使用 HTTPS。 |
is_http | boolean | 页面是否使用 HTTP。 |
high_waiting_time | boolean | 时间(TTFB)是否 1.5 秒。 |
no_doctype | boolean | 页面是否缺少 DOCTYPE 声明。 |
canonical | boolean | 页面是否设置规范 URL。 |
no_encoding_meta_tag | boolean | 页面是否缺少编码标签;在 canonical=true 时提供。 |
no_h1_tag | boolean | 页面是否缺少或为空的 H1 标签;在 canonical=true 时提供。 |
https_to_http_links | boolean | HTTPS 页面是否指向 HTTP 页面的链接;在 canonical=true 时提供。 |
has_html_doctype | boolean | 页面是否 HTML DOCTYPE 声明。 |
size_greater_than_3mb | boolean | 页面大小是否 3 MB;在 canonical=true 时提供。 |
meta_charset_consistency | boolean | 页面声明的字符集与字符集是否一致;在 canonical=true 时提供。 |
has_meta_refresh_redirect | boolean | 页面是否通过 meta refresh 重定向;在 canonical=true 时提供。 |
has_render_blocking_resources | boolean | 页面是否阻塞渲染的脚本或样式;在 canonical=true 时提供。 |
redirect_chain | boolean | 页面是否存在多次重定向。 |
low_content_rate | boolean | 纯文本占页面大小的比例是否低于 0.1;在 canonical=true 时提供。 |
high_content_rate | boolean | 纯文本占页面大小的比例是否高于 0.9;在 canonical=true 时提供。 |
low_character_count | boolean | 页面字符数是否少于 1024;在 canonical=true 时提供。 |
high_character_count | boolean | 页面字符数是否 256000;在 canonical=true 时提供。 |
small_page_size | boolean | 页面大小是否小于 1024 字节;在 canonical=true 时提供。 |
large_page_size | boolean | 页面大小是否 1 MB;在 canonical=true 时提供。 |
low_readability_rate | boolean | Flesch-Kincaid 可读性得分是否低于 15;在 canonical=true 时提供。 |
irrelevant_description | boolean | 描述与正文是否不,性阈值为 0.2;在 canonical=true 时提供。 |
irrelevant_title | boolean | 标题与正文是否不,性阈值为 0.3;在 canonical=true 时提供。 |
irrelevant_meta_keywords | boolean | 与正文是否不,性阈值为 0.6;在 canonical=true 时提供。 |
title_too_long | boolean | title 是否 65 个字符;在 canonical=true 时提供。 |
title_too_short | boolean | title 是否少于 30 个字符;在 canonical=true 时提供。 |
deprecated_html_tags | boolean | 页面是否使用废弃 HTML 标签;在 canonical=true 时提供。 |
duplicate_meta_tags | boolean | 页面是否多个相同类型的标签;在 canonical=true 时提供。 |
duplicate_title_tag | boolean | 页面是否多个 title 标签;在 canonical=true 时提供。 |
no_image_alt | boolean | 图片是否缺少 alt 属性;在 canonical=true 时提供。 |
no_image_title | boolean | 图片是否缺少 title 属性;在 canonical=true 时提供。 |
no_description | boolean | 页面是否缺少或为空的 description 标签;在 canonical=true 时提供。 |
no_title | boolean | 页面是否缺少或为空的 title 标签;在 canonical=true 时提供。 |
no_favicon | boolean | 页面是否缺少 favicon;在 canonical=true 时提供。 |
seo_friendly_url | boolean | URL 是否符合 SEO 友好标准。检查相对路径长度、特殊字符、动态参数和 URL 与页面的性。 |
flash | boolean | 页面是否 Flash素。 |
frame | boolean | 页面是否 frame、iframe 或 frameset 标签。 |
lorem_ipsum | boolean | 页面是否 Lorem ipsum 占位文本;在 canonical=true 时提供。 |
has_misspelling | boolean | 页面是否拼写错误。 |
seo_friendly_url_characters_check | boolean | URL 是否大小写拉丁字母、数字和连字符。 |
seo_friendly_url_dynamic_check | boolean | URL 是否不动态参数。 |
seo_friendly_url_keywords_check | boolean | URL 是否与 title标签。 |
seo_friendly_url_relative_length_check | boolean | URL 相对路径是否不 120 个字符。 |
is_orphan_page | boolean | 页面是否为孤立页面,即没有站页面链接指向它。 |
is_link_relation_conflict | boolean | 指向该页面的链接是否同时 dofollow 和 nofollow 链接。 |
has_links_to_redirects | boolean | 页面是否链接到返回 3XX 重定向的页面。 |
recursive_canonical | boolean | 是否存在循环规范化,即页面 A 指向页面 B,而页面 B 又指回页面 A。 |
canonical_chain | boolean | 是否存在规范 URL 链,例如 A 指向 B,B 又指向 C。 |
canonical_to_redirect | boolean | 规范 URL 是否指向发生 3XX 重定向的页面。 |
canonical_to_broken | boolean | 规范 URL 是否指向返回 4xx 或 5xx 的页面。 |
最后修改信息 last_modified
| 字段 | 类型 | 说明 |
|---|---|---|
last_modified | object / null | 资源变更信息;无数据时为 null。 |
last_modified.header | string / null | HTTP Header 中的最后修改时间,UTC 格式。 |
last_modified.sitemap | string / null | Sitemap 中的最后修改时间,UTC 格式。 |
last_modified.meta_tag | string / null | 页面标签中的最后修改时间,UTC 格式。 |
示例时间格式:
text
2019-11-15 12:57:46 +00:00请求示例
cURL
bash
curl --location --request POST \
"https://api.seermartech.cn/v3/on_page/duplicate_tags" \
--header "Authorization: Bearer smt_live_YOUR_KEY" \
--header "Content-Type: application/json" \
--data-raw '[
{
"id": "07281559-0695-0216-0000-c269be8b7592",
"type": "duplicate_description",
"limit": 10
}
]'Python
python
import requests
url = "https://api.seermartech.cn/v3/on_page/duplicate_tags"
headers = {
"Authorization": "Bearer smt_live_YOUR_KEY",
"Content-Type": "application/json",
}
payload = [
{
"id": "07281559-0695-0216-0000-c269be8b7592",
"type": "duplicate_description",
"limit": 10,
}
]
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 200:
result = response.json()
# 根据 result["status_code"] 判断业务处理结果
print(result)
else:
print(f"HTTP 请求失败:{response.status_code}")TypeScript
typescript
import axios from "axios";
const payload = [
{
id: "07281559-0695-0216-0000-c269be8b7592",
type: "duplicate_description",
limit: 10,
},
];
axios
.post(
"https://api.seermartech.cn/v3/on_page/duplicate_tags",
payload,
{
headers: {
Authorization: "Bearer smt_live_YOUR_KEY",
"Content-Type": "application/json",
},
}
)
.then((response) => {
// 响应数据
console.log(response.data);
})
.catch((error) => {
console.error("请求失败:", error.response?.data || error.message);
});响应示例
以下示例展示查询重复描述标签时的主要响应结构:
json
{
"version": "0.1.20210129",
"status_code": 20000,
"status_message": "Ok.",
"time": "1.4464 sec.",
"cost": 0,
"tasks_count": 1,
"tasks_error": 0,
"tasks": [
{
"id": "07281559-0695-0216-0000-c269be8b7592",
"status_code": 20000,
"status_message": "Ok.",
"time": "1.4464 sec.",
"cost": 0,
"result_count": 1,
"data": {
"api": "on_page",
"function": "duplicate_tags",
"type": "duplicate_description",
"limit": 10
},
"result": [
{
"crawl_progress": "finished",
"crawl_status": {
"max_crawl_pages": 100,
"pages_in_queue": 0,
"pages_crawled": 100,
"total_pages_count": 2,
"pages_count": 2
},
"items_count": 1,
"items": [
{
"accumulator": "示例重复描述",
"total_count": 2,
"pages": [
{
"resource_type": "html",
"status_code": 200,
"location": null,
"url": "https://example.com/page-a",
"meta": {
"title": "示例页面标题",
"charset": 65001,
"follow": true,
"generator": null,
"htags": {
"h1": ["示例标题"]
},
"description": "示例重复描述",
"favicon": "https://example.com/favicon.ico",
"meta_keywords": null,
"canonical": "https://example.com/page-a",
"internal_links_count": 12,
"external_links_count": 2,
"inbound_links_count": 3,
"images_count": 5,
"images_size": 102400,
"scripts_count": 6,
"scripts_size": 204800,
"stylesheets_count": 2,
"stylesheets_size": 51200,
"title_length": 8,
"description_length": 10,
"render_blocking_scripts_count": 1,
"render_blocking_stylesheets_count": 1,
"cumulative_layout_shift": 0.1
},
"content": {
"plain_text_size": 8077,
"plain_text_rate": 0.0543,
"plain_text_word_count": 1155,
"automated_readability_index": 20.77,
"coleman_liau_readability_index": 9.49,
"dale_chall_readability_index": 11.57,
"flesch_kincaid_readability_index": 6.18,
"smog_readability_index": 28,
"description_to_content_consistency": 0.56,
"title_to_content_consistency": 0.71,
"meta_keywords_to_content_consistency": null,
"deprecated_tags": null,
"duplicate_meta_tags": null,
"spell": null,
"resource_errors": {
"errors": [],
"warnings": []
},
"social_media_tags": {}
},
"page_timing": {
"time_to_interactive": 872,
"dom_complete": 1007,
"largest_contentful_paint": 1648.48,
"first_input_delay": 0.055,
"connection_time": 10,
"time_to_secure_connection": 22,
"request_sent_time": 0,
"waiting_time": 406,
"download_time": 1,
"duration_time": 439,
"fetch_start": 0,
"fetch_end": 439
},
"onpage_score": 88.36,
"total_dom_size": 2312840,
"custom_js_response": null,
"custom_js_client_exception": null,
"broken_resources": false,
"broken_links": false,
"duplicate_title": true,
"duplicate_description": true,
"duplicate_content": true,
"click_depth": 1,
"size": 148870,
"encoded_size": 33167,
"total_transfer_size": 34974,
"fetch_time": "2021-02-24 17:02:22 +00:00",
"cache_control": {
"cachable": false,
"ttl": 0
},
"checks": {
"no_content_encoding": false,
"high_loading_time": false,
"is_redirect": false,
"is_4xx_code": false,
"is_5xx_code": false,
"is_broken": false,
"is_www": true,
"is_https": true,
"is_http": false,
"high_waiting_time": false,
"no_doctype": false,
"canonical": true,
"no_encoding_meta_tag": true,
"no_h1_tag": false,
"https_to_http_links": false,
"has_html_doctype": true,
"size_greater_than_3mb": false,
"meta_charset_consistency": true,
"has_meta_refresh_redirect": false,
"has_render_blocking_resources": true,
"redirect_chain": false,
"low_content_rate": true,
"high_content_rate": false,
"low_character_count": false,
"high_character_count": false,
"small_page_size": false,
"large_page_size": false,
"low_readability_rate": true,
"irrelevant_description": false,
"irrelevant_title": false,
"irrelevant_meta_keywords": false,
"title_too_long": true,
"title_too_short": false,
"deprecated_html_tags": false,
"duplicate_meta_tags": true,
"duplicate_title_tag": false,
"no_image_alt": true,
"no_image_title": true,
"no_description": false,
"no_title": false,
"no_favicon": false,
"seo_friendly_url": false,
"flash": false,
"frame": false,
"lorem_ipsum": false,
"has_misspelling": false,
"is_orphan_page": false,
"is_link_relation_conflict": false,
"has_links_to_redirects": false,
"recursive_canonical": false,
"canonical_chain": false,
"canonical_to_redirect": false,
"canonical_to_broken": false
},
"content_encoding": "gzip",
"media_type": "text/html",
"server": "Apache",
"is_resource": false,
"last_modified": {
"header": "2021-10-21 14:11:10 +00:00",
"sitemap": null,
"meta_tag": "2021-03-15 00:00:00 +00:00"
}
}
]
}
]
}
]
}
]
}实用场景
- 定位重复标题页面:批量发现同一网站中使用相同
title的 URL,减少页面主题混淆并优化搜索结果展示。 - 理重复描述标签:识别用相同
description的页面,为产品页、分类页和页制定差异化描述。 - 筛选指定重复文本:通过
accumulator精确查找某一段重复标题或描述,支持 CMS 模板问题的快速排查。 - 结合页面性能制定优化优级:利用
onpage_score、LCP、TTFB、页面大小和阻塞资源等字段,优处理重复标签且加载性能较差的页面。 - 批量审计重复页面的技术 SEO 问题:结合规范 URL、孤立页面、重定向链、失效链接和重复检查结果,完善站页面治理流程。