先做一件事:把“异常”从页面级判断降为参数级判断。固定同一路径、同一时间窗,只改变一个参数值,观察百度爬虫返回的状态码、响应长度和抓取耗时是否随参数切换而分叉。如果无参数版本正常、带参数版本异常,问题不在整站,而在参数进入服务端后的某一段处理链。下一步不是继续看汇总报表,而是用最小参数集复现。
同样是带参数的URL,处理位置不同,排查路径完全不同。
判断依据不靠猜测,靠对比原始响应。用同一请求头、同一IP出口,分别请求无参数版和异常参数版,记录状态码、响应字节数、首字节时间和正文中是否出现关键内容。若只有状态码变化,偏服务端;若状态码相同而正文不同,偏渲染或缓存;若两者都相同,则异常可能来自日志采样、抓取频次变化或URL被替换,而不是页面本身。
不要一次测试十几个参数。先列出现异常URL中的全部参数,再按“可能影响服务端行为”排序,通常包括分页、筛选、排序、语言、来源标识和会话类参数。然后做单变量切换:保留一个参数,其余全部删除;若异常消失,说明该参数是必要触发条件;若异常仍在,换下一个参数单独测试。
假设一个列表页无参数正常,带?page=2&sort=price&filter=stock时异常。先只保留page=2,再只保留sort=price,最后只保留filter=stock。若只有filter=stock触发异常,就继续测试该参数的不同取值,例如stock=0、stock=1、空值和非法值。这个过程的目标不是找到“所有坏URL”,而是找到触发异常的最小条件。最小条件一旦确定,开发和运维才能判断是参数校验缺失、缓存穿透,还是查询条件导致超时。
实施动作上,建议把每次请求的结果记成四列:URL、状态码、响应字节数、是否包含正文关键内容。这个记录会直接影响下一步:如果状态码正常但正文缺失,下一步查渲染和缓存;如果状态码异常且响应时间同步升高,下一步查服务端查询和超时设置。
百度爬虫的访问日志能回答“它请求了什么”,但不能单独回答“它为什么没收录”。抓取量下降、某参数URL归零,可能有多种解释:爬虫调整了抓取配额、站点返回了不稳定状态、URL被规范到其他版本、robots.txt或防火墙规则变化、日志采样丢失。归零本身不是处理正确的证据,也不是故障的唯一证据。
可核对的证据是:同一时间窗内,无参数URL的抓取状态是否稳定;异常参数URL是否集中出现5xx或连接中断;返回200的URL正文是否与预期一致。若只有异常参数URL出现5xx,而其他URL稳定,问题更偏参数处理;若所有URL同时波动,先查出口、防火墙、DNS或整站可用性,而不是继续改参数逻辑。
缩小复现条件后,通常面临两个方向,选择依据不同。
若异常只在特定IP段、特定时间或高并发时出现,优先查限流、CDN缓存和源站负载,而不是参数解析。若带参数URL返回200但内容为空,且无参数版本也偶尔为空,问题可能是模板或数据源不稳定,参数只是放大了概率。若站点刚调整过HTTPS、重定向或站点地图,先核对协议和跳转链是否一致;HTTPS不保证安全无漏洞或排名,站点地图也不保证收录。最后,任何复现结论都应注明测试时间、请求头和参数组合,否则不同角色对“正常”的理解仍会分叉。