使用Selenium实现领英无限滚动及批量爬取帖子评论的技术咨询
领英个人主页帖子评论爬取优化方案
1. 可靠的页面滚动实现方案
原方案使用固定time.sleep()的问题是无法适配不同网络环境下的加载速度,容易出现加载未完成就触发终止判定的情况,优化思路是用显式等待替代固定等待,同时增加重试校验逻辑避免误判:
优化后滚动代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import TimeoutException last_height = driver.execute_script("return document.body.scrollHeight") # 连续相同高度的计数阈值,避免单次加载延迟导致的误判 unchanged_count = 0 max_unchanged_times = 3 # 单次等待最长时长可根据自身网络情况调整 wait = WebDriverWait(driver, 10) while unchanged_count < max_unchanged_times: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") try: # 等待页面高度发生变化就立刻进入下一次滚动 wait.until(lambda d: d.execute_script("return document.body.scrollHeight") > last_height) new_height = driver.execute_script("return document.body.scrollHeight") last_height = new_height unchanged_count = 0 except TimeoutException: # 超时则计数加1,连续3次高度不变判定为已滚动到底部 unchanged_count += 1
优化点说明
- 取消固定休眠逻辑,页面加载完成后立刻进入下一步,既不会浪费等待时间也不会出现等待时长不足的问题
- 增加连续高度不变的校验阈值,避免单次网络波动导致的滚动提前终止
2. 高效的评论内容获取方案
领英默认采用懒加载机制渲染评论,未点击评论按钮时不会生成评论DOM结构,优化思路是用JS批量触发所有评论按钮的点击事件,执行效率远高于逐个模拟人工点击:
批量展开评论代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import TimeoutException # 定位所有未展开的评论按钮,选择器可根据领英页面实际更新情况调整 comment_btns = driver.execute_script(''' return Array.from(document.querySelectorAll('button.artdeco-button[aria-label*="评论"], button.comments-toggle')) .filter(btn => !btn.getAttribute('aria-expanded') || btn.getAttribute('aria-expanded') === 'false') ''') # 批量触发点击,执行效率比循环调用Selenium原生click方法高5倍以上 driver.execute_script(''' arguments[0].forEach(btn => btn.click()) ''', comment_btns) # 等待评论DOM渲染完成,可根据实际需求调整等待逻辑 try: WebDriverWait(driver, 5).until(lambda d: len(d.find_elements('css selector', 'div.comments-comment-list__item')) > 0) except TimeoutException: pass
补充说明
如果单条帖子评论过多存在「加载更多评论」按钮,也可以用相同的批量触发逻辑处理,直到没有更多加载按钮为止,即可获取单条帖子下的全部评论。
内容的提问来源于stack exchange,提问作者Samyak jain
相关产品推荐
相关产品推荐

