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

使用Selenium爬取Airbnb数据遇阻,请求技术协助

解决Airbnb爬虫的Selenium问题

先搞定NoSuchWindowException错误

这个报错大概率是ChromeDriver和Chrome浏览器版本不匹配,或是手动指定驱动路径时出了问题。现在Selenium 4.6+已经内置了Driver Manager,不用再手动下载和指定路径,直接用下面的方式初始化驱动:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 自动匹配Chrome版本,初始化驱动
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

另外,操作元素前必须等页面加载完成,别急于点击或输入。用WebDriverWait显式等待,比硬编码time.sleep()靠谱得多。

元素定位别用动态Class,换稳定方式

Airbnb的Class名都是动态生成的,刷新页面就会变,用By.CLASS_NAME定位肯定失效。换成XPath或CSS选择器,结合元素的固定属性(比如aria-label、data-testid)或者层级结构来定位。

示例:搜索波兰并提取房源数据的完整流程

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

# 初始化驱动(代码同上)
driver.get('https://www.airbnb.com.br/')

# 处理Cookie弹窗(巴西站点按钮为葡萄牙语,需对应)
wait = WebDriverWait(driver, 10)
try:
    cookie_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Aceitar todos')]")))
    cookie_btn.click()
except:
    pass

# 等待搜索框加载,输入波兰
search_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@aria-label='Destino']")))
search_input.click()
search_input.send_keys('Poland')

# 触发搜索
search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")))
search_btn.click()

# 等待房源卡片加载完成
wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[@data-testid='card-container']")))

# 提取房源信息
listings = driver.find_elements(By.XPATH, "//div[@data-testid='card-container']")
data = []
for listing in listings:
    # 房源名称(用固定的data-testid属性定位)
    title = listing.find_element(By.XPATH, ".//div[@data-testid='listing-card-title']").text
    # 城市/位置
    city = listing.find_element(By.XPATH, ".//div[@data-testid='listing-card-subtitle']").text
    # 价格
    price = listing.find_element(By.XPATH, ".//span[@data-testid='price-amount']").text
    
    data.append({
        'title': title,
        'city': city,
        'price': price
    })

# 转成DataFrame
df = pd.DataFrame(data)
print(df)

# 关闭驱动
driver.quit()

关键注意点

  • 优先用data-testid属性定位:Airbnb很多元素都带这个固定测试ID,比动态Class名稳定太多,比如data-testid='listing-card-title'就是房源标题的固定标识。
  • 显式等待必须加:Airbnb页面加载慢且有大量动态渲染内容,跳过等待直接找元素必报错。
  • 注意站点语言差异:巴西站点的按钮、提示文本都是葡萄牙语,定位时要对应调整文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:10:35