You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Selenium WebDriver爬取TripAdvisor时多页面文本重复提取问题

解决ChromeDriver爬取TripAdvisor第二页重复内容的问题

这种情况我碰到过好多次,大概率是页面动态加载未完成或者元素定位逻辑没跟上页面更新导致的,给你几个针对性的解决思路:

  • 等待页面完全加载/元素更新
    点击下一页后,浏览器需要时间通过AJAX加载新内容,直接提取的话会拿到之前的缓存元素。你可以用WebDriverWait来等待第二页的标志性元素出现(比如页面底部的页码变化,或者某个只有第二页才有的商家元素),示例代码大概是这样:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 点击下一页按钮
    next_btn = driver.find_element(By.XPATH, "//a[@aria-label='Next page']")
    next_btn.click()
    
    # 等待第一页的第一个商家元素失效(说明页面已更新)
    WebDriverWait(driver, 10).until(
        EC.staleness_of(driver.find_element(By.XPATH, "//div[@data-test-target='activity_list_item']/div[1]"))
    )
    # 或者等待页码变为2
    WebDriverWait(driver, 10).until(
        EC.text_to_be_present_in_element((By.XPATH, "//span[@class='current']"), "2")
    )
    

    这里用staleness_of是等待第一页的旧元素失效,确保新内容已经渲染完成,之后再提取就不会拿到重复数据。

  • 检查下一页按钮的点击是否真正生效
    有时候TripAdvisor的下一页按钮可能需要滚动到可见位置才能触发有效点击,或者网络延迟导致点击后没跳转。你可以先滚动到按钮位置再点击:

    next_btn = driver.find_element(By.XPATH, "//a[@aria-label='Next page']")
    driver.execute_script("arguments[0].scrollIntoView();", next_btn)
    next_btn.click()
    

    另外也可以点击后检查当前URL是否变化——TripAdvisor的分页URL通常会带有pageNum=2这类参数,确认URL更新后再提取内容。

  • 优化XPath定位逻辑
    如果你用的是通用的XPath(比如//div[@class='listing']),有时候页面会保留第一页的DOM元素只是隐藏起来,这时候提取还是会拿到旧内容。可以尝试结合分页容器的属性,定位当前活跃的分页内容:

    //div[@data-page='2']//div[@class='activity_list_item']
    

    或者只提取可见的元素:

    //div[@class='activity_list_item' and not(@style='display:none;')]
    
  • 强制刷新页面(备选方案)
    如果前面的方法都没见效,点击下一页后可以强制刷新一次页面,再提取内容:

    next_btn.click()
    driver.refresh()
    # 等待页面加载完成
    WebDriverWait(driver, 10).until(EC.title_contains("Page 2"))
    

    不过这种方法效率稍低,优先用前面的等待方案更稳妥。

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

火山引擎 最新活动