在开发下拉词采集工具的过程中,我们遇到了一个棘手的问题:小红书的搜索框突然无法输入了。代码明明没有改动,之前能正常工作的采集逻辑却一夜之间失效。经过两天的排查,我们最终揭开了一个有趣的现象——小红书页面里“藏着”两个搜索框。
周一早上,用户反馈小红书下拉词采集失败。查看日志,发现搜索框定位成功,但 click() 和 input() 操作全部报错 NoRectError——元素没有位置和大小。这很奇怪,因为元素明明存在,为什么不可见?
我们用 JavaScript 遍历页面所有输入框,发现了一个意外情况:
找到 2 个 textarea textarea[0] 不可见 textarea[1] 可见,位置: x=286, y=83
原来,小红书页面上竟然有两个完全相同的 textarea 元素!它们的 class 都是 textarea,name 都是 aiSearchTextarea,placeholder 都是“搜索或输入任何问题”。
第一个是隐藏的,第二个才是真正的搜索框。

代码中一直使用 page.ele('textarea.textarea') 来定位搜索框,这个方法默认返回第一个匹配的元素。以前第一个和第二个都是可见的,所以没问题。但最近小红书前端更新后,第一个变成了隐藏元素,导致所有操作失败。
修改定位逻辑,优先取第二个 textarea:
textareas = page.eles('tag:textarea')
if len(textareas) >= 2:
search_input = textareas[1] # 取第二个
同时保留了多种备选方案,兼容旧版页面结构。
这次调试经历提醒我们:前端的微小变化可能导致爬虫彻底失效。页面元素看似相同,但可见性、位置、层级都可能改变。多一份备选逻辑,就多一份稳定性。
小红书为什么要放两个搜索框?也许是为了某些 JS 交互,也许是为了防止自动化。但无论如何,这次“双面人生”的发现,让我们对现代 Web 应用的复杂性有了更深的认识。