01抓取:先拿到字节
抓取阶段只有一个问题:系统能不能取到你的页面。它取决于状态码、robots.txt 的规则、CDN 或防火墙是否拦截、是否需要登录。浏览器里能打开,只证明一种访问条件成立,不能推广到所有爬虫。
同一家厂商的机器人往往不止一个。以 OpenAI 为例,负责搜索的、涉及模型训练的、以及用户主动触发的访问,是不同标识,规则也分开配置。放行搜索机器人不等于放行训练用途,反过来也一样,这两件事应当作为两个独立决定来做。
02解析:从 HTML 里取出正文
取到字节之后,系统要判断哪部分是正文。它会去掉导航、页脚、广告和脚本,留下标题层级与段落。如果你的内容只在浏览器执行脚本后才出现,原始 HTML 里就只剩一个空的挂载点,解析阶段拿不到东西。
这就是服务端渲染与客户端渲染的差别所在。Google 能执行 JavaScript,但不同平台、不同抓取器的能力并不一致;把关键事实放在需要脚本才渲染的位置,等于赌对方愿意执行脚本,而这个赌注没有任何保证。
03索引:进不进库,和这次选不选中
索引是把解析出的内容收进可搜索的库,检索是这次问题有没有命中它。两件事必须分开排查:一个页面可能已经被收录,却因为不回答该问题而永远不被选中;也可能内容很相关,却因为没被收录而无从参与。
sitemap.xml 的作用常被高估。它是帮助发现 URL 的提示,不规定何时处理,也不保证收录。提交成功、已抓取、已索引、被引用,是四个独立状态,把它们记成四个字段,比反复提交有用得多。
- 提交 sitemap 只说明地址被看到
- 已抓取不等于已索引
- 已索引不等于会被这次问题选中
- 被引用不等于带来访问
04引用:来源是怎么被标上去的
生成阶段会把检索到的片段组织成回答,引用则是把某句话与某个来源关联起来。这个关联未必准确:可能标了转载页而不是原文,也可能链接存在却不支持旁边的判断,甚至可能是模型自己拼出来的地址。
对站点来说,可操作的部分是让事实更容易被摘取:一句话说清一个结论,条件和限制紧挨着它,数字带上单位与时间。含糊的表述即使被读到,也很难被准确复述,更难被当作证据引用。
05按阶段倒查的自查顺序
逐项猜很慢,按阶段倒查要快得多。先确认原始 HTML 里有正文,再看索引状态,最后才谈内容与引用。顺序颠倒的话,你可能花一整天改文案,而问题其实出在防火墙把爬虫挡在了门外。
每一步都留下证据:保存原始响应、保存响应头、保存引用实际指向的 URL,并记下执行时间与所用命令。没有留痕的检查只能得到印象,得不到可以复查的结论,下次复测时也无法确认环境到底有没有变过。
- 用命令行取回页面,保存原始 HTML 而不是渲染后的 DOM
- 在源码里搜一句独有正文,搜不到就是渲染问题
- 核对 robots.txt、robots meta、X-Robots-Tag 与 canonical
- 在站长工具里看索引状态,别用提交回执代替
- 记录引用实际指向的 URL,而不只是域名
要点
- 状态码 200 只说明请求成功,不说明正文可读
- 正文依赖脚本渲染时,原始 HTML 里可能只有一个空容器
- 索引、检索、引用是三个状态,不能用提交回执代替
- 让每句话自带条件与单位,才有被准确摘取的可能