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

