如何使用Selenium爬取Google Flights航司及票价信息 解决空列表问题
Google航班爬虫定位问题修复方案
核心错误点
- 访问URL拼写错误:原URL中
searchtfs应为search?tfs,缺少路径和参数的分隔符?,会导致无法正常加载目标航班搜索结果。 - 等待时间不足:Google航班属于动态渲染页面,1秒的等待时间不足以加载完全部航班数据,容易拿到未渲染完成的空结构。
- XPath使用错误:提取航空公司的XPath使用了绝对路径,前缀的
.没有生效,完全脱离了当前遍历的航班卡片节点,自然无法匹配到内容。 - 定位属性不稳定:用到的
class属性、data-gs属性大部分是Google前端框架生成的动态随机值,刷新页面、切换访问环境都会变化,完全不适合作为定位依据。
修复后代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from lxml import html driver = webdriver.Chrome(r"C:\Users\14074\Python\chromedriver") # 修正URL拼写错误 URL = 'https://www.google.com/travel/flights/search?tfs=CBwQAhopagwIAxIIL20vMHBseTASCjIwMjEtMTItMjNyDQgDEgkvbS8wMWYwOHIaKWoNCAMSCS9tLzAxZjA4chIKMjAyMS0xMi0yN3IMCAMSCC9tLzBwbHkwcAGCAQsI____________AUABSAGYAQE&tfu=EgYIAhAAGAA' driver.get(URL) # 替换固定sleep为显式等待,最多等10秒直到航班卡片加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_all_elements_located((By.XPATH, '//div[@role="listitem"]'))) tree = html.fromstring(driver.page_source) # 用稳定的role属性定位航班卡片,Google航班的每个航班条目默认role为listitem for flight_tree in tree.xpath('//div[@role="listitem"]'): # 用相对路径+相对稳定的class属性提取航空公司名称 title = flight_tree.xpath('.//span[contains(@class, "h1fkLb")]/span/text()') # 用相对路径+相对稳定的class属性提取票价 price = flight_tree.xpath('.//span[contains(@class, "YMlIz FpEdX")]/text()') # 过滤空值输出 title = title[0].strip() if title else "未获取到航空公司" price = price[0].strip() if price else "未获取到票价" print(title, price) driver.close()
额外注意事项
- 如果运行后仍出现空值,先打印
driver.page_source检查返回的页面内容,大概率是触发了Google的反爬人机验证,可通过添加代理、降低请求频率解决。 - 如果定位失效,可自己打开页面F12检查结构,优先用
role、aria-label这类业务属性定位,不要用浏览器复制的长绝对路径和动态class属性。 - 长期使用建议对接官方航班数据接口,前端爬虫的稳定性远低于官方接口。
内容的提问来源于stack exchange,提问作者Nicholas O'Callaghan
相关产品推荐
相关产品推荐

