Letterboxd爬虫评论展开异常:底部评论未完全展开如何解决?
问题分析与修复方案
你的核心问题是初始统计的展开按钮数量不完整,且点击后未等待页面状态稳定,导致底部未加载的评论始终处于折叠状态。
具体问题根源
- 一开始就统计所有
a.reveal的数量,但此时底部评论可能还没滚动加载出来,这些评论里的展开按钮根本没被计入统计,循环自然不会处理它们。 - 点击展开按钮后直接递减计数,没有等待页面DOM更新,可能展开操作还没完成就进入下一次循环,导致部分展开操作失效。
- 底部的展开按钮可能在视口外,直接点击会触发无效操作。
修复后的代码
// 循环处理所有展开按钮,直到页面上没有剩余 while (true) { const revealLinks = firstPage.locator('a.reveal'); const remaining = await revealLinks.count(); if (remaining === 0) break; // 获取第一个展开按钮,滚动到它确保在视口内可点击 const targetReveal = revealLinks.first(); await targetReveal.scrollIntoViewIfNeeded(); // 点击并等待该按钮消失,确保评论完全展开 await Promise.all([ targetReveal.click(), firstPage.waitForSelector('a.reveal', { state: 'detached', timeout: 5000 }) ]); } // 等待所有评论元素加载完成 await firstPage.waitForSelector('.js-listitem .js-review .body-text', { state: 'visible' }); // 提取评论内容(简化了原有的p标签遍历逻辑,textContent已包含所有文本) const pageOneReviews = await firstPage.locator('.js-listitem .js-review .body-text') .evaluateAll(els => els.map(el => el.textContent.trim())); await context.close(); return { pageOneReviews };
关键优化说明
- 动态统计按钮数量:每次循环都重新统计当前页面的展开按钮,确保新滚动加载出来的评论里的按钮也被处理。
- 滚动到目标元素:用
scrollIntoViewIfNeeded()保证按钮在视口内,避免因元素不可见导致点击失败。 - 等待DOM更新:点击后等待该展开按钮从DOM中移除,确保评论完全展开后再继续。
- 简化文本提取:直接使用
el.textContent就能获取评论的所有文本内容,无需手动遍历p标签(如果需要保留段落分隔,可保留原逻辑)。
额外补充:如果页面是滚动加载评论
如果目标页面需要滚动到底部才加载更多评论,要先执行滚动加载逻辑,再处理展开按钮:
// 先滚动加载所有评论到页面 await firstPage.evaluate(async () => { let lastScrollHeight = document.documentElement.scrollHeight; while (true) { window.scrollTo(0, lastScrollHeight); await new Promise(resolve => setTimeout(resolve, 1000)); const newScrollHeight = document.documentElement.scrollHeight; if (newScrollHeight === lastScrollHeight) break; lastScrollHeight = newScrollHeight; } });
把这段代码放在处理展开按钮的循环之前即可。
内容的提问来源于stack exchange,提问作者orangepiccolo
相关产品推荐
相关产品推荐

