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

Selenium初始化WebDriver报错,如何实现Skyscanner低价机票采集?

问题修复与解决方案

一、修复WebDriver初始化报错

报错核心原因是Selenium 4+版本API变更,旧版本直接传驱动路径的写法已被弃用,且你传入的是Chrome浏览器程序路径而非ChromeDriver驱动路径,导致参数类型不匹配。

修复步骤:

  1. 下载与本地Chrome版本匹配的ChromeDriver,获取其路径(例:C:\\chromedriver-win64\\chromedriver.exe)
  2. 导入ChromeService类管理驱动路径
  3. 调整WebDriver初始化代码

修复后的初始化代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service  # 新增导入

chrome_options = Options()
chrome_options.add_argument("--headless=new")  # Selenium 4.10+推荐的无头模式写法
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")  # 添加UA规避反爬

# 注意:此处为ChromeDriver驱动路径,而非Chrome浏览器路径
driver_path = 'C:\\chromedriver-win64\\chromedriver.exe'
service = Service(driver_path)

# 正确初始化driver
driver = webdriver.Chrome(service=service, options=chrome_options)

二、优化机票采集逻辑

Skyscanner存在反爬机制,页面元素动态加载,需调整采集逻辑提升稳定性:

1. 替换硬编码等待为智能等待

去掉time.sleep(20),改用显式等待处理弹窗与核心元素加载:

try:
    driver.get(url)
    
    # 处理Cookie授权弹窗(无弹窗则跳过)
    try:
        accept_cookie_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@data-testid='accept-all-btn']"))
        )
        accept_cookie_btn.click()
    except:
        pass
    
    # 等待低价机票价格元素加载(使用更稳定的data-testid定位)
    cheapest_flight = WebDriverWait(driver, 30).until(
        EC.presence_of_element_located((By.XPATH, "//span[@data-testid='price']"))
    )
    
    print(f"Cheapest Flight Price: {cheapest_flight.text}")

finally:
    driver.quit()

2. 扩展日期范围采集

若需采集特定日期范围的低价机票,可循环生成对应搜索URL:

import random

# 示例:生成2024年5月4日-5月10日的搜索URL
base_url = "https://www.skyscanner.net/transport/flights/lond/mnl/{}/?adultsv2=1&cabinclass=economy&childrenv2=&inboundaltsenabled=false&outboundaltsenabled=false&preferdirects=false&ref=home&rtn=0"
date_range = [f"2405{day:02d}" for day in range(4, 11)]

for date in date_range:
    url = base_url.format(date)
    driver.get(url)
    
    # 复用上述弹窗处理、价格采集逻辑
    try:
        accept_cookie_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@data-testid='accept-all-btn']"))
        )
        accept_cookie_btn.click()
    except:
        pass
    
    cheapest_flight = WebDriverWait(driver, 30).until(
        EC.presence_of_element_located((By.XPATH, "//span[@data-testid='price']"))
    )
    print(f"Date {date}: Cheapest Price - {cheapest_flight.text}")
    
    # 添加随机延迟规避反爬
    time.sleep(random.uniform(3,7))

3. 反爬注意事项

  • 避免高频请求,使用随机间隔延迟
  • 定期更换User-Agent字符串
  • 无头模式下添加--window-size=1920,1080模拟正常浏览器窗口
  • 若触发验证码,需手动处理或接入验证码识别服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:24:50