Selenium初始化WebDriver报错,如何实现Skyscanner低价机票采集?
问题修复与解决方案
一、修复WebDriver初始化报错
报错核心原因是Selenium 4+版本API变更,旧版本直接传驱动路径的写法已被弃用,且你传入的是Chrome浏览器程序路径而非ChromeDriver驱动路径,导致参数类型不匹配。
修复步骤:
- 下载与本地Chrome版本匹配的ChromeDriver,获取其路径(例:
C:\\chromedriver-win64\\chromedriver.exe) - 导入
ChromeService类管理驱动路径 - 调整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
相关产品推荐
相关产品推荐

