扫描是怎么工作的
Loomaly 如何发现页面、做规则检查和 AI 判断、测量代表页速度并计算健康分。
整站扫描会在这些时候运行:你调用 add_site 时、让助手用 check(target: site)时,以及通过每周自动复查、sitemap 变化或部署 Webhook 自动触发时。它分几个阶段:
- 页面发现:从 sitemap 和爬虫找出你的页面。
- 页面模板:把 URL 结构相同的页面归到一组,并挑出代表页。
- 规则检查和 AI 判断:每个页面都做。
- 代表页:用真实浏览器重新打开,并测量页面速度。
- 页面判断:在全站范围内互相比较页面。
- 内部链接建议:找出值得在页面之间补上的链接。
- 健康分和「先修什么」的排序随着结果陆续更新。
也可以只扫描单个页面:让助手用 check(传入 URL 或 finding)。这会只对这一个页面跑第 3、4 步。
页面发现
Loomaly 先看你的网站自己怎么描述自己,再去爬漏掉的页面。
- robots.txt 和 sitemap:先读取
/robots.txt,再读取/sitemap.xml、/sitemap_index.xml、/sitemap-index.xml以及 robots.txt 里声明的 sitemap,遇到 sitemap 索引文件会继续往下读子 sitemap。最多保留 10,000 个 URL,同时记下每个页面的lastmod日期。首页一定会被收进来。已发现至少 10 个页面却没有 sitemap,是没有 sitemap。有 sitemap 时,爬虫找到的可收录页面如果不在里面(末尾斜杠、www和查询字符串不算不同页面),是 sitemap 漏了页面。这两条不会同时出现。登录页和应用页返回 200 又没有 noindex,是登录页或应用页可以被收录。robots.txt 里只有注释时,会提示这个文件由主机代管。 - 爬取:接着从首页出发顺着链接爬,最多点三层,找出 sitemap 里没有列出的页面。免费版最多爬 200 个页面,付费套餐最多 1,000 个。
- 靠 JavaScript 渲染的网站:如果 sitemap 加爬取一共找到的页面不足 20 个,说明网站的链接很可能是在浏览器里生成的,Loomaly 会用一个真实浏览器(会执行你的 JavaScript)再爬一遍。
- 哪些会被排除:只保留你域名下的页面(带不带
www视为同一个网站)。图片、PDF、订阅源以及.txt、.xml、.json这类不是网页的文件会被跳过。如果你设置了路径范围(比如/gb),只保留这个路径下的页面。
robots.txt 禁止抓取的页面(针对所有爬虫或针对 LoomalyBot 的规则)会标上 robots 屏蔽,并且完全不会被抓取:不做规则检查、不做 AI 判断、不测性能,也不参与页面判断。网站已经要求爬虫不要进来。
如果 robots.txt 屏蔽了我们的爬虫
如果 robots.txt 屏蔽了 Loomaly 用来发现页面的爬虫,或者用 Content-Signal 指令拒绝了搜索类爬取,扫描会停下,status / say 会报告站点管理者已选择退出 SEO 爬取。要放行的话,把下面两行加进 robots.txt,再让助手重新扫描:
User-agent: CloudflareBrowserRenderingCrawler
Allow: /如果一个页面都没发现(sitemap 被屏蔽,或者网站把我们所在地区的访问重定向到了别处),先修好 sitemap 或放行爬虫,再让助手用 check(target: site)重新扫描。
页面模板和代表页
大多数网站都是由少数几种模板搭起来的:所有商品页共用一个版式,所有博客文章共用一个,所有分类页也共用一个。Loomaly 按 URL 结构给页面分组,比如 /products/blue-mug 和 /products/red-teapot 都属于模板 /products/*。像 /about 这样路径独一无二的页面,自己就是一个模板。
Loomaly 会从每个模板里挑出代表页,均匀分布在整个模板里,而不是只挑列表最前面的几个:
| 模板里的页面数 | 代表页数量 |
|---|---|
| 1–3 | 全部 |
| 4–100 | 3 |
| 101–1,000 | 5 |
| 超过 1,000 | 8 |
代表页会用真实浏览器重新打开,并测量页面速度(见下文)。不管是不是代表页,每个页面都会做同样的规则检查和 AI 判断。
每个页面:规则检查 + AI 判断
Loomaly 找到的每个页面(每次扫描最多 1,500 个,robots.txt 禁止抓取的除外)都走同样的两步。读取的是服务器直接返回的 HTML,不执行 JavaScript。
规则检查
凡是能从页面 HTML 里确定下来的,都由代码判断,每次结果都一样:
- 标题和 meta description(缺失、太短、太长)
- canonical 链接(缺失,或指向了别的 URL)、viewport 标签、
noindex和nofollow,以及<html>上的lang属性 - 标题层级:没有 H1、不止一个 H1、跳级
- 图片:缺少 alt 或 alt 为空;页面有 4 张以上图片却一张都没做懒加载
- 链接:没有内链、内链少于 3 个,或外链超过 100 个
- 结构化数据:没有 JSON-LD、JSON-LD 有错误、首页没有 Organization schema、较深层级的页面没有面包屑 schema
- Open Graph 标签和
og:image,以及网站图标(favicon) - hreflang:声明了 hreflang,却缺少指向自身的那一条或缺少
x-default - HTTP 错误、用
http://访问的页面、不执行 JavaScript 就是一个空壳的页面,以及正文不足 300 词的页面(中日韩文字按字计)
规则说明里把这些规则标为规则检查。
AI 判断
有些事只有读过页面才能判断。对每个页面,Loomaly 把它的路径、标题、小标题、一小段开头文字、对篇幅的描述,以及页面上找到的按钮和行动链接交给 AI 模型,一次问完下面这组问题:
| 问题 | 可能产生的问题 | 对哪些页面提问 |
|---|---|---|
| 这是什么类型的页面(文章、商品、分类、落地页、文档、首页、功能页、其他)? | 决定下面哪些回答适用 | 所有页面 |
| 就这个页面的用途而言,内容够不够充实? | 内容单薄 | 有正文的页面 |
| 读起来像不像人写给人看的,搜索词的密度是否正常? | 疑似关键词堆砌 | 正文 150 词及以上的页面 |
| 每个小节是不是开门见山给出答案,单独拿出来也能读懂? | 页面不利于被 AI 引用 | 至少有两个 H2 的文章、文档和落地页 |
| 页面里有没有问答内容? | FAQ 类内容缺少 FAQ schema | 页面还没有 FAQPage 标记时 |
| 有没有给访客一个明确的下一步? | 访客不知道下一步该做什么 | 记录到了按钮的首页、落地页和商品页 |
| 标题说的和页面实际提供的内容一致吗? | 标题和页面内容对不上 | 有标题且有正文的页面 |
| 有没有写明作者、有没有显示日期? | 缺少作者署名、缺少发布日期 | 结构化数据里还没写明这些信息的文章 |
哪些回答适用于哪类页面由代码决定,所以商品页不会因为「没有作者」被报问题。只有把握很大的回答才会变成问题:模型要有大约 90% 的把握认为答案是「否」(FAQ 那一题则是「是」)。把握不够的回答直接丢弃,既不显示,也不影响分数。页面文字只作为待判断的数据交给模型,绝不会被当作指令。
登录、购物车、结账、搜索、法律条款和联系表单这类页面,以及 noindex 页面、会跳转的页面和返回错误的页面,不做 AI 判断。服务器返回的 HTML 里正文不到 150 个字符的页面也不做:没有可读的内容。如果这样的页面本身体积不小(HTML 在 20 KB 以上),规则检查会改报页面只在客户端渲染,因为不执行 JavaScript 的爬虫(包括大多数 AI 爬虫)看到的就是这个几乎空白的页面。
所有问题说明和修复 prompt 都来自 Loomaly 自己的模板,同一个问题每次扫描的描述都一样。助手在 todo 置顶项(fixPrompt)以及需要时通过 problem 拿到这些提示;只有你额外要求它起草改动时,才会再写一段。
规则检查在所有套餐里都不占用页面数。AI 判断也不占用:免费套餐每次扫描判断最重要的 20 页,付费套餐判断每一页。如果某个页面的 AI 判断没跑成,这个页面之前由 AI 判断发现的问题会保持未解决,不会被当成已修复,直到之后的扫描重新判断了它。
todo 和 problem 里每个问题只出现一次,并列出它出现在哪些页面模板上,1,000 个商品页上的同一个问题只显示为一件事,在模板里改一次就行。跳转到其他网站的页面不算你网站的页面:它会从列表中移除,上面的问题也会被自动忽略。
代表页与性能
代表页不走整站检查,而是单独扫描一次。对每个代表页,Loomaly 会:
- 用真实浏览器打开页面,JavaScript 渲染出来的内容也算在内,和 Google 看到的一样。
- 在渲染后的页面上再跑一遍同样的规则检查和 AI 判断。
- 用 PageSpeed Insights 和真实用户数据测量性能(见下文)。
你让助手用 check 扫描的单个页面,也走同样这三步。
实测多少个代表页
每实测一个代表页,占用一个套餐月度页面数。一次扫描会按你本月剩余的页面数来实测代表页,每次最多 150 个,并且不会超过网站实际的代表页数量。页面数用完时,扫描仍会对每个页面做规则检查和 AI 判断,只是在页面数重置或你升级之前不做深度检测。详见套餐与页面数。
为了把这些页面数用在刀刃上:
- 先广后深:每个模板先实测第一个代表页,所有模板都轮到之后,才会实测某个模板的第二个。
- 最久未扫的优先:距离上次扫描最久的代表页先测。如果网站的模板数超过一次扫描能测的数量,多次扫描会轮流覆盖剩下的模板,而不是每次都测同一批页面。
- 分批启动:每分钟启动 40 个,而不是一次全部启动。150 个页面的扫描,最后一批大约在第 3 分钟启动。
为什么只在代表页上测性能
用真实浏览器打开页面、再跑一遍 PageSpeed Insights,每个页面都要花时间和成本;而同一个模板生成的页面,加载的脚本、样式和版式都一样,性能表现几乎总是相同。所以速度只在每个模板的少数几个页面上测,而真正因页面而异的检查(规则检查、AI 判断和页面判断)在全站范围内做。
性能与 Core Web Vitals
扫描代表页时,Loomaly 会用 Google PageSpeed Insights 测一遍(移动端),并查询 Chrome 用户体验报告(CrUX,真实用户在手机上的数据)。有真实用户数据时优先用它,因为 Google 排名看的就是这个;没有的话再用实验室测量数据。超过下面的阈值就会报问题:
| 指标 | 报问题的阈值 |
|---|---|
| 最大内容绘制(LCP) | 超过 2.5 秒 |
| 交互到下一次绘制(INP,仅真实用户数据) | 超过 200 毫秒 |
| 累积布局偏移(CLS) | 超过 0.1 |
| 首字节时间(TTFB) | 超过 800 毫秒 |
| Lighthouse 性能分 | 低于 50 |
| LCP 图片缺少优先级提示 | PageSpeed Insights 报告时 |
LCP、INP、CLS 和 TTFB 落在 Google「需要改进」区间时算警告,只有真实用户数据落在「差」区间才算错误;只有实验室数据时最多算警告。每个问题都会注明数据来自这个页面本身、整站(页面访问量不够时 Google 退回整站数据)还是实验室。超过 45 天的测量结果不再计分,对应问题变为待复测。这些问题和其他问题一样出现在 todo 里。如果 PageSpeed Insights 没能测到某个页面,这次扫描不会给它报性能问题,也不会把它之前的性能问题标记为已修复。
页面判断
有些问题只有把页面互相比较,或者专门去找悄悄坏掉的页面,才能发现:这个页面是不是在和那个页面抢流量?这个商品是不是已经下架了?由代码先挑出可疑的候选页面,AI 只判断这些候选。
整站检查结束后,会在后台跑一轮判断,最多覆盖 1,500 个页面:
- 互相争抢的页面:Loomaly 把每个页面的标题、H1 和开头文字,与站内最相似的几个页面做比较。几乎一模一样的页面对会交给 AI,判断它们是重复、同一商品的不同款式(尺寸、颜色、语言不同)、内容重叠,还是各有用途。只有重复和内容重叠会被报为问题:与站内另一页争抢同一个搜索,并写明对方是哪个页面。已经通过 canonical 或 hreflang 互相指向的页面,以及会跳转的页面,不参与比较。
- 空页面或已失效的页面:文字很少(不足 80 个词)的页面,或者标题、H1、开头文字里写着「售罄」「页面不存在」之类的页面,会交给 AI 判断它到底是什么。结果可能是错误页面以正常页面返回(软 404)、已下架或缺货的页面仍可被收录,或没有实际内容的占位页。登录页、购物车、法律条款页以及
noindex页面本来就应该很短或不进搜索,所以会被跳过。
每一轮最多判断 150 组页面对和 100 个可疑页面,最相似的、问题最明显的优先。置信度低于 0.60 的判断会被丢弃。0.60 到 0.85 的会保存,但默认不出现在 todo 和周报里,除非在 /account 打开「显示置信度较低的 AI 判断」;0.85 及以上会直接显示。这些判断仍然计入健康分。结果通常比扫描的其他部分晚几分钟出现在 todo。页面判断类的问题只有在之后的判断轮次重新判断了这个页面、并且问题不再出现时才会关闭。
内部链接建议
整站扫描的页面判断结束后,Loomaly 会接着找值得补的内部链接。不需要你点什么:每次整站扫描之后都会自动跑一轮,大网站需要几分钟。这一轮会:
- 取最多 500 个最近扫描过、并且有正文内容的页面。
- 对每个页面,找出站内内容和它最接近的页面,这些页面最适合放一个链向它的链接。
- 在这些页面里找一句已经提到相关主题的话,以及句中适合做锚文本的词。已经存在的链接不会重复建议。
- 让 AI 判断一个编辑会不会真的加上这条链接。
结果可通过 todo 的 view: links 查看。这条是非判断把 0.90 及以上当作可以直接采纳。标定里这个门槛从未被达到——入选的建议都落在 0.50 到 0.90 之间——所以列表展示整批建议,而不是一个空列表。todo 可以传 routing: "act",只要更严的那一档。每条建议会显示放链接的页面、链接指向的页面,以及那句话。你加好链接(或决定不加)之后,用 triage 的 decide_link 标成 accepted 或 dismissed。建议下面列出的是站内没有任何其他页面链接到的页面。Loomaly 不会改动你的网站:采纳一条建议只是为你的团队把它标记为已处理。
健康分
健康分由五个维度组成:可收录性、页面基础、内容与 AI 可读性、结构化数据、性能。在一个页面上,一个错误让所在维度记 0 分,一个警告扣 25 分,一个提示扣 5 分(提示最多共扣 10 分)。每个维度按检查过的页面取平均,总分是五个维度的加权平均。权重、性能怎么计分和完整示例见健康分怎么算。
所有来源的未解决问题都计分,已标记修复但还没复查确认的问题也计分;已忽略和已修复的问题不计分。status 和 report 会显示每个维度的得分,以及修好每个主要问题能涨多少分。每个页面检查完都会更新分数,所以扫描过程中分数会变动,页面判断结果出来后也会再变一次。
| 分数 | 状态 |
|---|---|
| 80–100 | 健康 |
| 50–79 | 需要优化 |
| 0–49 | 存在风险 |
各环节的上限
| 环节 | 上限 |
|---|---|
| sitemap | 最多 10,000 个 URL |
| 爬取 | 最多三层链接;免费版 200 个页面,付费套餐 1,000 个页面 |
| 浏览器渲染爬取 | 仅在 sitemap 加爬取找到的页面不足 20 个时触发 |
| 规则检查和 AI 判断 | 每个页面都做,每次扫描最多 1,500 个;不限量,不占页面数 |
| 代表页(浏览器渲染 + 性能) | 每次扫描最多 150 个,受本月剩余页面数限制 |
| 页面判断 | 每轮最多 1,500 个页面、150 组页面对、100 个可疑页面 |
| 内链建议 | 每轮最多 500 个页面,每次整站扫描后自动运行 |