当URL参数可以任意排列、任意重复、任意填值,地址空间在数学上就是无限的。有效地址集合不能靠枚举全部组合来定义,只能靠“哪些参数会改变页面实质内容”来划定。实际操作中,先确定一组参数白名单及其取值范围,再让不在白名单内的参数一律指向规范地址,是唯一可规模化的做法。下面从“少量样本成立、规模化后崩掉”的矛盾现象说起。
假设一个商品筛选页,参数有颜色、尺码、排序、页码。手工打开几个组合,页面内容确实不同,于是判断“这些地址都有效”。但当参数允许任意顺序、任意大小写、任意空值、任意重复时,组合数量会迅速膨胀。爬虫或站点地图一铺开,就会生成大量内容几乎相同、只有参数排列不同的地址。
这类问题的典型表现是:站内日志里出现大量从未被用户点击过的URL;同一页面被多个参数顺序指向;空值参数与省略参数同时存在。样本阶段看不出问题,是因为样本恰好落在少数“有意义”的组合上,而规模化暴露的是参数空间的组合爆炸。
解释一:参数确实改变页面实质内容。例如颜色筛选后返回的商品集合不同,这类参数属于内容参数,应当保留在有效地址集合内。
解释二:参数只改变展示形式或来源标记,不改变实质内容。例如排序方式、会话标识、来源追踪参数、大小写差异、参数顺序差异。这类参数会生成大量近似重复地址,属于应被规范化的参数。
两种解释的分界不在于参数名,而在于:改变该参数后,页面主体内容(标题、主体文本、主要链接集合)是否发生实质性变化。只看页面HTML是否不同会误判,因为排序参数也会让HTML顺序不同,但内容集合并未改变。
要判断一个参数属于哪一类,可以收集以下证据:
这些证据不能单独下结论。例如抓取量归零,可能是参数被正确规范化,也可能是爬虫暂时降低了抓取频率,还可能是该路径被robots.txt限制。robots.txt的抓取限制不等于可靠的索引移除,所以不能仅凭日志下降判断处理正确。
把上面的判断落成一组可执行动作:
执行第2步时,如果发现某个内容参数的取值本身也接近无限(例如任意关键词搜索),需要额外限制:只对真实存在的筛选值生成可抓取地址,其余值返回无内容或规范到上级页面。这一步的结果会直接影响下一步:如果内容参数范围仍然开放,后续的规范化规则就无法收敛,有效地址集合会重新膨胀。
假设某站点有3个参数:颜色(红/蓝)、尺码(S/M)、排序(价格/销量)。若把三者都视为内容参数,组合数为2×2×2=8,加上参数顺序和大小写变体,实际地址数会更多。若只把颜色和尺码视为内容参数,排序视为展示参数并统一剔除,有效地址集合收敛为2×2=4个,每个对应唯一规范地址。这个例子只用于说明分类方法对集合规模的影响,不代表任何真实站点的参数结构。
需要说明的是,站点地图不保证收录,canonical标签也只是建议而非强制。不同搜索引擎对参数处理和canonical的支持情况须分别核查。HTTPS不保证安全无漏洞或排名,它与地址集合的定义无关,不应混入这层判断。
如果参数值本身由用户输入且无法预先枚举,例如搜索关键词、地理位置坐标,那么“白名单加取值范围”的方法不适用。此时应改为:只对系统预定义的筛选值生成可抓取地址,用户自由输入的参数值不进入有效地址集合,页面通过noindex或规范到上级页面处理。判断依据是参数值是否可被有限枚举,而不是参数名本身。
另一种边界是参数组合之间存在依赖关系,例如某些颜色只对应某些尺码。此时不能简单做笛卡尔积,而应按实际存在的组合生成地址,否则会造出大量返回空结果的地址。验证方法是:对生成的每个地址抓取一次,确认页面主体内容非空且与参数一致,再决定是否保留在有效地址集合内。