You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Selenium滚动Airbnb评论弹窗以抓取全部评论

抓取Airbnb评论时的弹窗滚动加载问题

我用Python Selenium抓取Airbnb房源全部评论时遇到问题:必须点击「显示全部评论」按钮弹出弹窗后,滚动弹窗才能加载更多评论。但弹窗出现后无法滚动,不滚动的话所有评论不会显示,甚至Chrome开发者工具里都看不到未加载的评论内容。

已尝试的无效操作

  • 点击显示全部评论按钮:
reviews_lista = []
boton_revs = driver.find_element(By.XPATH, "//button[@data-testid='pdp-show-all-reviews-button']")
boton_revs.click()
  • 定位弹窗元素:
bloque_pop = driver.find_element(By.XPATH, "//div[@class='_14vzertx']")
  • 多种滚动代码尝试:
    方法一:
scroll = 0
while scroll < 5: # scroll 5 times
    driver.execute_script('arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;', bloque_pop)
    time.sleep(1)
    scroll += 1

方法二:

driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")

方法三:

bloque_pop = driver.find_element(By.XPATH, "//div[@class='_14vzertx']")
for i in range(5):
    #driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", bloque_pop)
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight)", bloque_pop)
    time.sleep(1.5) 

解决方案

核心问题

你定位的弹窗元素_14vzertx不是真正的滚动容器,Airbnb评论弹窗的滚动区域是内部的子容器,只有操作这个子容器才能触发加载。另外,JS滚动可能被页面的事件监听拦截,改用模拟鼠标滚动更有效。

实现代码

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

# 等待并点击显示全部评论按钮
boton_revs = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@data-testid='pdp-show-all-reviews-button']"))
)
boton_revs.click()

# 等待评论弹窗的滚动容器加载(需根据实际页面调整XPath,找带overflow-y的子容器)
scroll_container = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//div[@data-testid='modal-container']//div[contains(@style, 'overflow-y')]"))
)

# 循环滚动直到无新评论加载
last_review_count = 0
while True:
    # 获取当前已加载的评论数量
    current_reviews = driver.find_elements(By.XPATH, "//div[@data-testid='review-card']")
    current_count = len(current_reviews)
    
    if current_count == last_review_count:
        break  # 评论数量不再变化,停止滚动
    
    last_review_count = current_count
    
    # 模拟鼠标滚轮向下滚动(贴近用户操作,更容易触发加载)
    ActionChains(driver)\
        .move_to_element(scroll_container)\
        .scroll_by_amount(0, 800)\
        .perform()
    
    time.sleep(2)  # 等待评论加载完成

# 提取所有评论内容
reviews_lista = [review.text.strip() for review in current_reviews]

关键注意事项

  1. 定位正确的滚动容器:打开Chrome开发者工具,在弹窗内右键检查滚动区域,找到带有overflow-y: auto或overflow-y: scroll样式的div,替换代码中的XPath
  2. 用显式等待替代直接定位:确保元素完全加载后再操作,避免因页面异步加载导致的元素找不到问题
  3. 通过评论数量判断加载完成:固定滚动次数可能漏加载或重复滚动,用数量变化判断更可靠

内容的提问来源于stack exchange,提问作者Elmauro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:25:43