惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
博客园 - 【当耐特】
IT之家
IT之家
M
MIT News - Artificial intelligence
酷 壳 – CoolShell
酷 壳 – CoolShell
Martin Fowler
Martin Fowler
V
Visual Studio Blog
F
Fortinet All Blogs
The Cloudflare Blog
Last Week in AI
Last Week in AI
博客园 - 司徒正美
G
Google Developers Blog
Vercel News
Vercel News
爱范儿
爱范儿
小众软件
小众软件
WordPress大学
WordPress大学
I
InfoQ
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
Check Point Blog
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

搜索引擎优化

分享一下简单好发,但质量很高的外链资源 - V2EX 使用 glm5.3 flash vibe 了一个网站 - V2EX 新人第一个站月浏览十万啦 - V2EX 被 Google 算法调整揍的好狠 - V2EX 做了一个导航站,收集了 200 个国外国内可以发外链的平台 - V2EX 搜索引擎对于时间久的网页和自动移出的吗? 多语言小语种的外链感觉很难发,我收集了几个,或许有人可以补充些吗? 分享我自己出海发的免费但权重很高的外链 分享一个 94 DR 免费外链 想搞点有质量的外链太难了!哭死! 一个空壳静态网站,每天 40 UV, Bing 排名意外靠前,该继续投入吗? WP 博客 sitemap.xml/robots.txt 正确,却始终无法提交到 GSC 的站点地图 SEO 优化求解,谷歌网站排名一直没上去 有没有懂 SEO 的老哥, Google 的搜索引擎怎么还不把我的博客文章放到搜索结果里 一个新游戏站 72 小时冲到 Google 首页后又“消失”的 SEO 复盘 请问大佬们, google 是不能抓取国内的网页了吗?我用的阿里云 DNS, google 一直说无法访问 robots.txt 做内容型网站这半年,我踩过的 SEO 内容规划坑 Google 收录 1119 万页, 1855 万未收录页面,究竟如何实现? 网站无法被 Bing/Google 收录,索引量突然降为 0 怎么处理? 前段时间开发的工具站,今天偶然谷歌搜索了一下,竟然发现排名很靠前 创建了一个“论坛” 各位大佬,seo 推广你们是怎么做的哇 如何快速上线一个新网站 求推荐站长 seo 工具 做 SEO 时,有哪些可以提交外链的网站集合? 分享一下可以用作外链的“个人主页”类的网站 我自己做了个网站,但是搜关键词,找不到我网站,应该怎么样把排名搞上去呢? Google 说外链要自然,但为啥还有人天天发导航站和博客评论? 我的网站 PageSpeed 全项 100 分,分享下优化思路 独立项目运营一周年经验分享
SEO 自动巡检怎么做:用 PageSpeed、DNS、SSL 与 WHOIS 定位...
Parry · 2026-08-25 · via 搜索引擎优化

SEO 巡检不能只看一个分数。页面加载变慢、Canonical 配置错误、DNS 记录漂移、证书临近到期,都会影响搜索引擎访问和用户体验,但它们属于完全不同的问题域。如果把所有信号混成一个“站点健康分”,报告看起来完整,却很难指导修复。

更实用的做法,是把巡检拆成三层:

  1. URL 层检查页面性能与 SEO 审计结果;
  2. 域名层检查 DNS 、SSL 与 WHOIS ;
  3. 规则层结合历史基线、数据新鲜度和连续次数生成行动项。

本文使用 网页性能与 SEO 评分DNS 查询SSL 证书解析WHOIS 查询,搭建一条可定时执行、可追踪、不过度告警的网站巡检管线。

网页性能与 SEO 评分

一张图看懂巡检数据怎么流动

同一个站点可以有几十个重点 URL ,但通常只对应一个主域名。页面评分应按 URL 执行,DNS 、SSL 、WHOIS 则应按域名去重执行,最后再汇聚成报告。

网站巡检信号汇聚流程

这条数据流有两个关键边界:页面结果不能代替域名状态,域名异常也不能直接伪装成页面 SEO 评分失败。两类检查分别保留原始状态,规则层只负责解释和分级。

四个接口分别回答什么问题

检查范围 接口 主要结果 适合回答的问题
URL PageSpeed 四类评分、FCP 、LCP 、TBT 、CLS 、SEO 审计、TopIssues 页面是否变慢,标题、Canonical 、robots.txt 、viewport 是否存在明显问题
域名 DNS A 、AAAA 、CNAME 、MX 、TXT 、NS 、SOA 等记录 解析记录是否符合预期,是否发生未经确认的变化
域名 SSL 证书链、有效期、主机与诊断信息 证书是否有效,是否接近到期,主机名是否匹配
域名 WHOIS 注册时间、到期时间、注册商、名称服务器等 域名注册信息是否可用,重要日期是否需要提醒

WHOIS 字段可能受注册局和隐私保护影响。字段缺失应标记为“未知”,不能直接判定为域名故障。

第一步:规范化 URL 和域名

巡检任务的输入不是一个模糊的“站点”,而是两组明确目标:

  • URL 清单:首页、产品页、文档页、转化页等重点页面;
  • 域名清单:从 URL 中提取并标准化后的唯一域名。
from urllib.parse import urlsplit


def normalize_target(page_url: str) -> tuple[str, str]:
    parsed = urlsplit(page_url)
    if parsed.scheme not in {"http", "https"} or not parsed.hostname:
        raise ValueError("A valid HTTP or HTTPS URL is required")

    hostname = parsed.hostname.encode("idna").decode("ascii")
    normalized_url = parsed._replace(fragment="").geturl()
    return normalized_url, hostname

不要用字符串切割域名。真实 URL 可能包含端口、国际化域名、IPv6 或路径中的相似文本。

PageSpeed 接口当前使用 GET /websitetools/pagespeed-score,支持 mobiledesktop 两种策略,默认是 mobile。一次请求可以返回:

  • Performance 、Accessibility 、Best Practices 、SEO 四类评分;
  • FCP 、LCP 、Speed Index 、TBT 、CLS 等页面体验指标;
  • 标题、描述、Canonical 、HTTP 状态、robots.txt 、viewport 等 SEO 审计摘要;
  • 最多 10 条主要待优化项;
  • 报告生成时间、报告版本和缓存标记。

新接入建议把 AppKey 保存在服务端环境变量中,并通过 Header 传递:

import json
import os
from urllib.parse import urlencode
from urllib.request import Request, urlopen


def fetch_pagespeed(page_url: str) -> dict:
    query = urlencode({
        "url": page_url,
        "strategy": "mobile",
        "locale": "zh-CN",
        "categories": "performance,accessibility,best-practices,seo",
        "forceRefresh": "false",
    })
    request = Request(
        f"https://api.gugudata.com/websitetools/pagespeed-score?{query}",
        headers={"X-GUGUDATA-APPKEY": os.environ["GUGUDATA_APPKEY"]},
        method="GET",
    )
    with urlopen(request, timeout=60) as response:
        payload = json.load(response)

    data_status = payload.get("DataStatus", {})
    if int(data_status.get("StatusCode", 0)) != 100:
        message = data_status.get("StatusDescription", "PageSpeed failed")
        raise RuntimeError(message)
    return payload.get("Data", {})

HTTP 200 只说明请求得到响应,不能替代业务状态判断。生产实现还要捕获超时和非 2xx 状态,并限制响应体大小。

第三步:按域名执行 DNS 、SSL 和 WHOIS 检查

三个域名接口当前都是 GET 请求:

/v2/websitetools/dns-lookup
/v2/websitetools/sslcertinfo
/v2/websitetools/whois

它们与 PageSpeed 存在一个容易踩坑的契约差异:

接口类型 状态对象 当前成功值
PageSpeed DataStatus.StatusCode 100
DNS 、SSL 、WHOIS v2 dataStatus.statusCode 200

因此,不能把 PageSpeed 的校验器直接复制给 v2 域名接口:

def require_v2_success(payload: dict) -> dict:
    data_status = payload.get("dataStatus", {})
    if int(data_status.get("statusCode", 0)) != 200:
        message = data_status.get("statusDescription", "Domain check failed")
        raise RuntimeError(message)
    return payload.get("data", {})

聚合层可以把两类结果统一映射为 successfailedunknown,但必须同时保留原始状态字段和采集时间,避免统一过程中丢失排错依据。

分数下降不等于立刻告警

巡检系统最难的部分不是请求接口,而是决定哪些信号需要立即处理。建议先识别可用性或安全硬故障,再排除缓存过期和计划内变更,最后比较历史基线。

SEO 巡检异常分级决策

这套决策逻辑把结果分为三类:

  • 立即处理:页面不可访问、证书无效等确定性硬故障;
  • 生成行动项:问题偏离历史基线,并连续出现或影响关键页面;
  • 继续观察:单次轻微波动、数据过旧或仍需下一轮确认的信号。

固定分数线通常不适合所有站点。更可靠的比较条件是同一 URL 、相同检测策略、相近采集条件下的历史变化。

四类信号如何转换成行动项

原始信号 容易产生的误判 建议动作
Performance 或 SEO 分数下降 页面已经故障 查看 TopIssues 、最终 URL 、缓存标记,并与同策略基线比较
DNS 记录变化 解析一定错误 与预期记录和计划变更窗口核对
SSL 证书接近到期 网站已经不可访问 生成到期提醒,核对自动续期状态和证书链
WHOIS 字段为空 域名异常 标记数据缺口,考虑隐私保护与注册局差异

行动项至少应包含目标、问题类型、严重度、首次发现时间、连续次数、证据摘要、负责人和下一步。没有明确责任人与动作的问题,只是一条日志。

缓存和数据时间必须可见

PageSpeed 返回 CachedFetchTime。如果报告只展示“任务在 10:00 执行”,读者可能误以为所有页面都在 10:00 重新检测。

建议分别保存:

  • scheduled_at:任务计划执行时间;
  • collected_at:本次响应时间;
  • fetch_time:评分报告实际生成时间;
  • cached:是否复用了近期结果;
  • strategy:mobile 或 desktop ;
  • report_version:报告版本。

常规巡检不应默认对全部页面使用 forceRefresh=true。关键页面出现异常时,可以由受控复核任务请求刷新。本文没有验证具体缓存窗口和刷新成本,因此不提供固定刷新间隔。

允许“部分完成”,不要用总状态覆盖事实

PageSpeed 可能成功,而 WHOIS 因字段不可用只返回部分信息; DNS 查询也可能失败,但页面仍然能够访问。一轮巡检最好支持以下状态:

状态 含义
complete 计划内检查均得到可用结果
partial 至少一项成功,至少一项失败或未知
failed 没有获得可用检查结果
stale 只有超过时效要求的历史结果

报告必须展示每个子检查的独立状态。新的临时失败也不应覆盖上一轮仍在有效期内的成功结果。

一份可执行的巡检报告应该包含什么

建议按以下顺序组织报告:

  1. 本轮范围:URL 数量、域名数量、检测策略与实际数据时间;
  2. 立即处理:可用性、证书和关键页面硬故障;
  3. 持续问题:连续出现的评分、Canonical 、DNS 或注册信息问题;
  4. 数据缺口:失败、未知、缓存过旧和权限不足;
  5. 行动清单:负责人、优先级、证据和下一次复核时间。

不要把完整 WHOIS 响应无差别复制到普通报告。它可能包含联系信息,应只保留支持业务判断的必要摘要,并按权限控制原始响应。

常见问题

是否需要每天强制刷新全站所有页面?

通常不需要。先按页面价值分层,常规任务记录缓存状态和真实数据时间;关键页面异常时再进行受控刷新。

DNS 、SSL 或 WHOIS 失败,是否代表页面 SEO 失败?

不代表。它们属于域名层信号。报告可以提升其优先级,但不能伪造 PageSpeed 结果。

单次 PageSpeed 分数下降是否应该告警?

硬故障可以即时处理;普通波动更适合结合历史基线、连续次数、变化幅度和页面重要性判断。

同一域名下有很多页面,域名接口需要重复调用吗?

通常不需要。页面检查按 URL 执行,DNS 、SSL 、WHOIS 按标准化域名去重执行,再在报告阶段关联。

上线前检查清单

  • URL 任务和域名任务分别去重、缓存和重试;
  • PageSpeed 与 v2 域名接口使用各自的成功契约;
  • AppKey 只保存在服务端,不进入前端代码和普通日志;
  • 保存最终 URL 、检测策略、缓存标记、实际数据时间和原始状态;
  • WHOIS 缺失字段保持 unknown ,不伪造默认值;
  • 任一子检查失败时,其他可信结果仍能进入报告;
  • 告警结合硬故障、历史基线、连续次数和页面重要性;
  • 重试有次数上限,新失败不会覆盖上一轮有效结果。

SEO 自动巡检的目标不是制造更多分数,而是把页面、域名和历史变化组织成一份有证据、有人负责、能够执行的行动清单。