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

