关键不在题目写得多复杂,而在你能否在动手前写出一条明确的判定规则:满足什么条件算通过,不满足时下一步改什么。如果一条规则只能靠“感觉差不多”来判断,它就不适合作为实操题的输出标准。
假设你想练习“抓取一个列表页并保存标题与链接”。一种做法是要求“把数据抓下来,整理成表格”,另一种是要求“输出一个文件,每行包含标题和链接,标题不得为空,链接必须以 http 开头,共覆盖列表页上可见的全部条目”。
前者看起来自由,后者看起来死板。矛盾就在这里:越自由的题目越像真实工作,但越难判断自己是否做对;越具体的题目容易判分,却可能把注意力引到格式而忽略采集逻辑本身。两种做法都成立,区别在于你当前要练的是哪一层能力。
第一种解释是,你处在熟悉工具阶段,需要的是把动作跑通。此时输出应当高度确定,例如固定字段、固定条数、固定文件格式,让你能快速发现是哪一步断了。
第二种解释是,你已经能跑通基本流程,需要练的是面对不完整页面时的判断。此时输出标准应留出空间,例如允许条目数量有少量出入,但要求你说明哪些条目被跳过、依据是什么。判定重点从“格式对不对”转为“取舍有没有理由”。
这两种解释对应不同的代价。前者省时间,但容易让你在真实页面变化时失去方向;后者更接近实际,但判定成本高,需要你自己记录判断过程。
可以看三个可观察的信号。第一,回看上一次练习,如果你能说清每个字段从哪里来,但说不清为什么某条被排除,说明你缺的是判断标准,应选第二种。第二,如果你能说出取舍理由,却经常在保存或字段对应上出错,说明你缺的是流程稳定,应选第一种。第三,如果同一道题重做两次,结果差异主要来自页面本身的变化而不是你的操作,说明你需要把判定规则写成对页面状态的描述,而不是对固定条数的要求。
一个可用的短例子:假设列表页有 20 条,其中 3 条标题为空。若你的规则是“必须输出 20 条”,你会被迫为空标题编造内容;若规则是“输出非空标题条目,并单独记录被跳过的条目及原因”,你就能保留可核查的痕迹。这个例子的数字只用于说明判定方式,不代表任何真实页面的固定情况。
无论选哪种,都可以把输出标准拆成三段,避免写成一句模糊要求。
写完这三段后,先不要急着改工具配置,而是拿一条已知条目手动走一遍规则。如果手动都判不出来,说明规则还需要收紧;如果手动能判出来,再让采集器按同样规则输出。这个动作的结果会直接影响下一步:规则能判,才值得去调选择器或翻页逻辑;规则不能判,先改规则,否则调完工具仍然不知道对错。
页面结构变化时,固定条数的规则会立刻失效,而基于状态的规则更容易迁移。你可以把“输出 20 条”换成“输出所有标题非空且链接可访问的条目,并记录被跳过的数量”。这样即使页面从 20 条变成 15 条,你仍然知道结果是否合理。
需要注意的是,条目数量变化本身不能单独证明你的采集逻辑正确。它可能来自页面改版、加载失败、筛选条件变化,也可能来自你的选择器写得过宽或过窄。要区分这些原因,可以固定一个已知条目作为对照:如果对照条目稳定出现,而其他条目增减,问题更可能在页面或筛选条件;如果对照条目也消失,问题更可能在选择器或请求环节。
最后,把每次练习的判定规则和实际输出放在一起保存。下次遇到相似页面时,你不必从零出题,只需检查旧规则是否仍然适用,并明确这次要练的是流程稳定还是取舍判断。这样,实操题才不只是做完一遍,而是能留下可复用的判断依据。