两种做法都成立,但适用条件不同:如果错误窗口短、出现频率高,优先用持续取证,把每次异常的时间、请求和响应原样记录下来;如果错误窗口长、触发条件可疑但难以预测,优先用事后复现,通过受控请求逼近触发边界。取舍的关键不是哪个更先进,而是你能否在错误消失前留下可复查的原始证据。
假设某目录下约两百个页面,白天抓取与收录表现正常,凌晨两点到四点之间,部分页面的抓取结果变成异常状态,天亮后自行恢复。你手上只有两个可选动作:一是部署持续取证,让脚本按固定间隔请求并保存响应;二是等到次日凌晨手动触发,尝试当场复现。下面按这个情境推演,数字仅用于说明比较方法,不代表真实项目结果。
先做一次低成本判断:连续三晚,每晚在异常时段前后各取一次样本,记录状态码、响应体摘要、响应时间和返回内容长度。如果三晚中有两晚以上能在同一时段捕捉到差异,说明异常有稳定的时间规律,持续取证值得投入;如果三晚都取不到差异,说明你选的采样点可能根本没落在错误窗口内,此时直接上持续取证只会得到一堆正常记录。
持续取证适合错误出现频繁、单次持续时间短、且你无法守在机器旁的情况。它的核心不是“多抓几次”,而是让每次请求都带上足够定位问题的字段,并且原样落盘,不做二次加工。
代价也很明确:持续取证会占用请求配额,频率设得过高可能干扰正常抓取统计,频率设得过低又会漏掉短窗口。更稳妥的做法是先用较低频率跑一两天,确认能命中异常后,再在异常时段附近临时提高频率。需要提醒的是,请求量归零或抓取量骤降本身不能单独证明处理正确,它也可能是抓取预算调整、上游调度变化或统计口径改变造成的,必须结合响应内容一起看。
事后复现适合错误窗口较长、或者你怀疑某个具体条件触发的情况,例如特定参数、特定来源、特定缓存状态。它的优势是可控:你可以一次只改一个变量,观察结果是否随之改变。
它的代价是依赖触发条件可被手动构造。如果异常由外部调度、临时资源紧张或上游状态引起,你在本地怎么改参数都复现不出来,这时事后复现会浪费大量时间,应转回持续取证。反过来,如果你已经通过持续取证拿到一批异常样本,再用事后复现去验证候选条件,两者是接力关系,不是二选一。
用一个可操作的判据:给持续取证设定一个观察上限,例如连续三个异常周期。如果三个周期内都拿到了可复查的异常记录,就继续沿这条线定位;如果三个周期内一次都没命中,说明要么采样点不对,要么异常并非按时间稳定出现,此时应改为事后复现,并优先检查最近改动过的配置、缓存策略和请求来源。
反过来,如果事后复现连续多次都无法稳定触发,而异常仍在特定时段出现,就应停止手动尝试,转为持续取证。切换动作本身要有记录:写明从哪一天、哪个时段开始换方法,换方法后下一次判断依据是什么。这样即使问题后来消失,你也能说清是方法没命中,还是问题真的不再出现。
拿到异常记录后,先做分类,不要急着下结论。常见分类包括:响应状态码变化、响应体内容变化、响应时间显著拉长、返回内容长度突变。不同分类指向不同的下一步。
如果排查后确认问题与抓取限制有关,要记住 robots.txt 的抓取限制不等于可靠的索引移除:它约束的是抓取行为,已经存在的结果不一定会因此立刻变化。站点地图也不保证收录,它只是提供发现线索。涉及多个渠道时再分别核查:搜索引擎、平台推荐和广告各自的支持情况不同,不能拿一个渠道的表现推断另一个。
最后把结论落成一句可验收的话,例如“在异常时段内,同一URL连续三次请求返回内容一致且与正常时段一致”,而不是“看起来好了”。验收标准写清楚,下一次异常再出现时,你才知道该比对什么。