提交网站前别急着填表:用 Python 自动检查 4 个基础问题

1 阅读4分钟

做网站的人经常把注意力放在功能上线,却在对外提交资料时遗漏最基础的检查。下面从工程实践的角度,把流程拆开看。

为什么先做技术自检

网站提交到导航或资源平台时,审核人员首先看到的是站名、分类和简介,但真正影响判断的往往是更基础的技术状态:链接能不能正常打开,是否连续跳转,页面标题是否清楚,HTTPS是否有效,访问是否过慢。只要其中一项异常,再完整的介绍也很难让人放心。

我把这类检查整理成一个小脚本,目标不是替代专业监控,而是在提交网站前快速发现明显问题。脚本只使用Python标准库,不依赖第三方包,适合当作刷题之外的一篇小型工程练习,也方便放进日常发布流程。

先定义需要观察的结果

一个可用的自检结果至少包含六项:输入地址、最终地址、HTTP状态、页面标题、是否使用HTTPS、请求耗时。输入地址和最终地址不同,说明发生了跳转;状态码不是2xx,需要进一步判断;标题为空或过于笼统,会降低用户识别网站用途的效率。

响应时间只做单次粗略观察,不应直接当作性能结论。网络环境、DNS和服务器瞬时负载都会影响结果,所以脚本的定位是“提交前提醒”,不是压测工具。

核心代码

下面的实现使用urllib.request发起请求,用time.perf_counter计算耗时,再从HTML中提取title。为了避免下载超大页面,只读取前512KB内容。

from dataclasses import dataclass, asdict
from html import unescape
from time import perf_counter
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
import re

TITLE_RE = re.compile(r"<title[^>]*>(.*?)</title>", re.I | re.S)

@dataclass
class SiteCheck:
    input_url: str
    final_url: str = ""
    status: int = 0
    elapsed_ms: int = 0
    title: str = ""
    https: bool = False
    error: str = ""

def clean_title(html: str) -> str:
    match = TITLE_RE.search(html)
    if not match:
        return ""
    title = re.sub(r"\s+", " ", unescape(match.group(1)))
    return title.strip()[:120]

def check_site(url: str, timeout: int = 8) -> SiteCheck:
    result = SiteCheck(input_url=url)
    request = Request(url, headers={
        "User-Agent": "SitePrecheck/1.0 (+manual review)"
    })
    started = perf_counter()
    try:
        with urlopen(request, timeout=timeout) as response:
            body = response.read(512 * 1024)
            result.elapsed_ms = round((perf_counter() - started) * 1000)
            result.status = response.status
            result.final_url = response.geturl()
            result.https = result.final_url.startswith("https://")
            charset = response.headers.get_content_charset() or "utf-8"
            html = body.decode(charset, errors="replace")
            result.title = clean_title(html)
    except (HTTPError, URLError, TimeoutError) as exc:
        result.elapsed_ms = round((perf_counter() - started) * 1000)
        result.error = str(exc)
    return result

if __name__ == "__main__":
    target = input("请输入待检查网址:").strip()
    print(asdict(check_site(target)))

如何解释输出

如果status为200且final_url与输入一致,说明基础访问路径比较直接;如果跳转到HTTPS版本通常是正常现象,但连续跨域跳转就应确认是否符合预期。title为空时,优先补充能准确说明网站用途的页面标题,而不是堆叠大量关键词。

当请求失败时,脚本会返回error字段。常见原因包括证书异常、解析失败、连接超时和服务器拒绝访问。不要为了让脚本显示成功而关闭证书验证,更合适的做法是修复真实问题,再重新检查。

把自检接入提交工作流

我自己的做法是把提交资料拆成两层。第一层是技术自检,确认链接、标题和访问状态;第二层是人工资料,准备准确的站名、所属分类、功能描述和适用人群。技术层解决“能不能打开”,人工层解决“用户能不能快速看懂”。

以易导航的免费网站提交收录为例,站长可以先完成这套自检,再提交真实、简洁的资料。平台后续的网站测评信息,更适合帮助用户定位和识别网站,而不是把收录页面写成夸张广告。免费提交也不等于必然收录,最终仍应以网站实际可用性、内容质量和平台审核为准。

还能怎样扩展

这个脚本可以继续加入favicon检测、robots.txt检查、移动端viewport判断、重复标题提醒和定时任务。进一步扩展时,建议把“自动检测到的事实”和“人工评价”分开保存:状态码、耗时属于可重复检测的数据;是否好用、适合谁,则需要说明判断依据。

一个小工具最有价值的地方,不是输出一个漂亮分数,而是让提交者知道下一步该改什么。只要结果能转化为具体动作,这次代码练习就已经超过了单纯记录语法。

实现层面不必一开始就做复杂系统,先把检查结果结构化,再逐步增加规则,反而更容易长期维护。

标签:Python、网站测试、开发工具、SEO、经验分享