拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SEO 自动巡检怎么做:用 PageSpeed、DNS、SSL 与 WHOIS 定位网站问题

Python 实现网站 SEO 巡检正确处理 PageSpeed 与域名接口状态把 PageSpeed、DNS、SSL 和 WHOIS 放进同一个 Python 任务时难点不在发出四个 HTTP 请求而在于正确处理不同返回契约、缓存信息和失败边界。本文以 网页性能与 SEO 评分 API 为主给出一套可复用的 Python 封装思路。示例使用标准库AppKey 通过服务端环境变量读取。先定义统一结果而不是统一原始响应PageSpeed 的业务状态位于DataStatus.StatusCode成功值为 100DNS、SSL、WHOIS v2 接口则返回dataStatus.statusCode200。强行用一套字段解析所有响应会把正常结果误判为失败。更合适的方法是分别验证原始契约再映射到统一结果from dataclasses import dataclass, field from typing import Any dataclass class CheckResult: check_name: str target: str ok: bool collected_at: str raw_status: int data: dict[str, Any] field(default_factorydict) error: str | None None统一结果用于报告和存储原始响应仍可在受控日志或对象存储中按合规要求保留。封装 GET 请求import json import os from urllib.parse import urlencode from urllib.request import Request, urlopen API_ROOT https://api.gugudata.com def get_json(path: str, params: dict[str, str], timeout: int 60) - dict: query urlencode(params) request Request( f{API_ROOT}{path}?{query}, headers{X-GUGUDATA-APPKEY: os.environ[GUGUDATA_APPKEY]}, methodGET, ) with urlopen(request, timeouttimeout) as response: return json.load(response)不要把 AppKey 放进params这样更容易避免密钥进入访问日志。生产实现还应限制读取大小并分别处理超时、连接错误和非 2xx HTTP 状态。PageSpeed 校验器def fetch_pagespeed(page_url: str) - dict: payload get_json( /websitetools/pagespeed-score, { url: page_url, strategy: mobile, locale: zh-CN, categories: performance,accessibility,best-practices,seo, forceRefresh: false, }, ) status payload.get(DataStatus, {}) if int(status.get(StatusCode, 0)) ! 100: raise RuntimeError(status.get(StatusDescription, PageSpeed failed)) return payload.get(Data, {})需要保存的不只是Scores。FinalUrl可以帮助发现重定向FetchTime与Cached用于解释数据时效TopIssues才能把分数转成具体优化项。v2 域名接口校验器def fetch_domain_check(path: str, domain: str) - dict: payload get_json(path, {domain: domain}, timeout30) status payload.get(dataStatus, {}) if int(status.get(statusCode, 0)) ! 200: message status.get(statusDescription, Domain check failed) raise RuntimeError(message) return payload.get(data, {}) def fetch_dns(domain: str) - dict: return fetch_domain_check(/v2/websitetools/dns-lookup, domain) def fetch_ssl(domain: str) - dict: return fetch_domain_check(/v2/websitetools/sslcertinfo, domain) def fetch_whois(domain: str) - dict: return fetch_domain_check(/v2/websitetools/whois, domain)这里按当前 v2 契约判断 200不要把 PageSpeed 的 100 复制过来。从 URL 安全提取域名from urllib.parse import urlsplit def extract_domain(page_url: 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) return parsed.hostname.encode(idna).decode(ascii)不要通过字符串切割提取域名。真实 URL 可能包含端口、认证信息、IPv6、国际化域名或路径中的相似文本。URL 与域名任务分别去重假设一次巡检包含同一域名下的 20 个页面PageSpeed 需要按 20 个 URL 执行DNS、SSL、WHOIS 通常只需按域名执行一次。def build_targets(page_urls: list[str]) - tuple[list[str], list[str]]: urls list(dict.fromkeys(page_urls)) domains list(dict.fromkeys(extract_domain(url) for url in urls)) return urls, domains这个小步骤能直接减少重复查询也让缓存键和失败重试更清晰。不要把所有失败都重试建议按三层分类类型例子处理传输失败超时、连接中断、临时 5xx有上限地退避重试契约失败业务状态非成功、字段缺失记录原始状态进入失败队列内容异常分数下降、证书临近到期、DNS 变化生成行动项不重试掩盖结果对参数错误、权限问题和稳定复现的业务失败不断重试只会消耗额度并延迟真正需要处理的问题。报告记录建议每次检查至少保存目标、检查类型、HTTP 状态、原始业务状态、采集时间、是否缓存、关键结果摘要、首次发现时间、连续出现次数和负责人。PageSpeed 评分应在相同strategy下比较WHOIS 字段缺失要标记为未知因为隐私保护或注册局差异都可能造成空值。最终报告要告诉读者“下一步做什么”而不是只打印 JSON。接入前自测使用无效 URL 验证参数失败路径。使用可重定向 URL 验证FinalUrl保存逻辑。确认 PageSpeed 成功码 100 与 v2 域名成功码 200 分开处理。多个同域 URL 只生成一组域名任务。日志中不出现 AppKey。缓存结果保留Cached与FetchTime。重试次数有上限业务异常不会被当成网络错误。正确处理接口边界之后SEO 巡检代码才有资格进入定时任务否则再漂亮的报告也可能建立在错误的成功判断上。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门