使用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
相关产品推荐
相关产品推荐

