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

Chrome 122使用--headless=new爬取Kayak失效问题求助

无头模式下Selenium无法获取Kayak页面元素的解决办法

环境信息

  • Chrome 版本:122.0.6261.95
  • ChromeDriver 版本:122.0.6261.94
  • Python 版本:3.8.3

问题

启用--headless=new无头模式参数时,爬取Kayak页面无法获取class为nrc6的元素,print(len(elements))输出0;注释该参数后,print(len(elements))可正常输出2。

解决办法

Kayak会通过浏览器特征识别自动化爬虫,无头模式下默认参数和正常浏览器差异明显,导致页面加载异常或被拦截。可以通过以下调整解决:

1. 补充浏览器伪装参数

给ChromeOptions添加以下参数,让无头浏览器更接近正常浏览器行为:

  • 设置窗口尺寸:--window-size=1920,1080(避免小窗口导致布局异常)
  • 自定义User-Agent:模拟正常Chrome的UA,避免HeadlessChrome标识被检测
  • 禁用自动化检测:--disable-blink-features=AutomationControlled
  • 其他辅助参数:如--enable-javascript确保JS正常执行、--incognito避免缓存干扰

2. 替换固定等待为显式等待

time.sleep(10)是固定等待,可靠性差。改用WebDriverWait等待目标元素出现,确保元素加载完成后再获取。

修改后的代码示例

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

service = Service(executable_path='chromedriver.exe')

option = webdriver.ChromeOptions()
option.add_argument("--headless=new")
option.add_argument('--ignore-certificate-errors')
option.add_argument("--no-sandbox")
option.add_argument('disable-notifications')
# 添加伪装参数
option.add_argument("--window-size=1920,1080")
option.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36")
option.add_argument("--disable-blink-features=AutomationControlled")
option.add_argument("--enable-javascript")
option.add_argument("--incognito")

driver = webdriver.Chrome(service=service, options=option)

def search(dep, arr, date):
    print(f'''Input: Date:{date},Departure: {dep} - Arrival: {arr}''')
    base_url = f'https://www.kayak.com/flights/SFO-PEK/2024-03-06?sort=price_a&fs=stops=0'
    
    my_url = base_url
    driver.get(my_url)
    print(my_url)
    
    # 显式等待目标元素加载,最长等待15秒
    try:
        WebDriverWait(driver, 15).until(
            EC.presence_of_all_elements_located((By.CLASS_NAME, "nrc6"))
        )
    except:
        print("元素加载超时")
    
    # 获取元素
    elements = driver.find_elements(By.CLASS_NAME, "nrc6")
    print(len(elements))

说明

  • 自定义User-Agent要和你的Chrome版本匹配,可在正常浏览器中通过navigator.userAgent查看
  • 显式等待能有效避免因网络延迟导致的元素未加载问题
  • 这些参数组合可以大幅降低被Kayak反爬机制识别的概率,确保页面正常渲染目标元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:15:21