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

使用Selenium的Firefox Driver需装Firefox吗?脚本属性获取失败如何解决?

问题解答

1. Librewolf搭配Firefox Driver是否需要本地安装Firefox?

需要。Firefox Driver(geckodriver)是针对官方Firefox开发的驱动程序,Librewolf虽是Firefox的分支,但geckodriver的兼容性和稳定性依赖官方Firefox的核心组件。本地安装Firefox能保证驱动与浏览器核心版本匹配,避免Librewolf的定制化修改引发兼容性问题,让Selenium脚本运行更顺畅。

2. 爬取第3页属性缺失的问题及优化方案

(1)是否需要增加等待时间?

肯定需要。前两页正常、第三页出错,大概率是第三页内容加载速度更慢,或是网站存在反爬延迟机制。你当前仅等待第一个元素可见,但find_elements可能在所有元素未完全渲染完成时就执行,导致部分元素的目标属性还未加载出来。

(2)更优实现方式

针对你的爬取场景,优化方向如下:

  • 等待所有目标元素加载完成,而非单个元素
  • 直接定位带有目标属性的元素,减少无效遍历
  • 添加异常处理,避免单个元素出错中断整个脚本
  • 使用presence_of_all_elements_located确保所有元素都已存在于DOM中

优化后的代码示例:

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

# 直接定位包含data-cc-cruise-id属性的tile元素
target_selector = "div.costa-itinerary-tile[data-cc-cruise-id]"
# 延长等待时长到20秒,可根据实际加载速度调整
wait = WebDriverWait(driver, 20)

# 等待所有目标元素都加载进DOM
tiles = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, target_selector)))

for tile in tiles:
    try:
        cruise_id = tile.get_attribute("data-cc-cruise-id")
        if cruise_id:
            # 这里可添加存储或后续处理逻辑
            print(cruise_id)
        else:
            print("当前元素的目标属性为空")
    except Exception as e:
        print(f"处理元素时发生错误: {str(e)}")

额外提示

  • 检查第三页是否需要滚动才能加载全部内容,如果是,要在爬取前添加滚动到底部的操作
  • 若需要元素可见才能获取属性,可把presence_of_all_elements_located替换为visibility_of_all_elements_located
  • 每页爬取完成后添加1-2秒的休眠(time.sleep(1)),降低被网站反爬机制识别的概率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:09:57