You need to enable JavaScript to run this app. 使用Selenium爬取Azamara站点全部目的地名称仅返回12条如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium爬取Azamara站点全部目的地名称仅返回12条如何解决

问题原因
  • 目标页面采用滚动懒加载机制:首次打开仅渲染前12条航行数据,剩余数据需要页面滚动到底部触发加载后才会渲染到DOM中
  • 你使用的绝对路径XPath稳定性极差,页面结构稍有变动就会定位失败
  • 未设置加载等待逻辑,可能元素还没渲染完成就执行了定位操作
修复方案

通过模拟页面滚动触发懒加载,配合显式等待确保元素加载完成,改用稳定性更高的相对XPath定位所有目标元素,修正后的代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

options = webdriver.ChromeOptions()
# 若需要无界面运行可取消下方注释
# options.add_argument('--headless=new')
driver = webdriver.Chrome('chromedriver', options=options)
url = 'https://www.azamara.com/int/find-a-journey#sort=date-asc'
driver.get(url)
driver.maximize_window()
# 设置最长10秒的显式等待
wait = WebDriverWait(driver, 10)

last_item_count = 0
while True:
    # 滚动到页面底部触发加载
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待数据加载完成,可根据网络情况调整等待时长
    time.sleep(2)
    # 定位所有航行名称元素
    voyage_items = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//div[contains(@class,"journey-card-title")]/a/h2')))
    current_item_count = len(voyage_items)
    # 两次加载的元素数量一致说明已加载完全部数据
    if current_item_count == last_item_count:
        break
    last_item_count = current_item_count

# 提取数据并去空
destinations = [item.text.strip() for item in voyage_items if item.text.strip()]
for dest in destinations:
    print(dest)

# 若需要导出为csv可取消下方注释
# import pandas as pd
# pd.DataFrame({'航行名称': destinations}).to_csv('azamara_voyages.csv', index=False, encoding='utf-8-sig')

driver.quit()
注意事项
  • 若网络环境较差,可适当延长滚动后的等待时长,避免数据未加载完成就终止循环
  • 可按需添加随机user-agent、随机滚动间隔等反爬逻辑,避免被网站限制访问
  • 若后续网站更新页面结构导致定位失效,可打开浏览器F12调试工具重新提取目标元素的通用定位规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 08:06:05