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

使用Selenium爬取Centris.ca时价格与MLS编号获取失败

解决Centris.ca房源MLS编号与价格爬取为空的问题

可能原因及对应解决方案

1. DOM结构更新导致选择器失效

网站大概率更新了房源卡片内MLS编号、价格的HTML结构,你之前使用的元素选择器已无法匹配目标内容。

  • 解决:重新用浏览器开发者工具(F12)定位新选择器:
    • 价格可能现在属于span[class*="property-price"]或div.price-value这类元素;
    • MLS编号可能在div[aria-label*="MLS"]或span.mls-code里。
    • 示例代码(基于新选择器):
      # 提取价格
      price = item.find_element(By.CSS_SELECTOR, 'span.property-price').text.strip()
      # 提取MLS编号(去除前缀)
      mls_raw = item.find_element(By.CSS_SELECTOR, 'div.mls-id').text.strip()
      mls = mls_raw.replace('MLS #', '')
      

2. 元素动态加载,未等待完全渲染

MLS和价格可能是页面滚动后或通过Ajax异步加载的,直接爬取时元素还未完成渲染。

  • 解决:使用显式等待,确保元素可见后再获取内容:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    for item in driver.find_elements(By.CSS_SELECTOR, 'div.property-thumbnail'):
        # 等待价格元素可见
        price = WebDriverWait(item, 10).until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, '你的价格选择器'))
        ).text.strip()
        # 等待MLS元素可见
        mls = WebDriverWait(item, 10).until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, '你的MLS选择器'))
        ).text.strip()
    

3. 反爬机制限制

网站可能新增了反爬检测,比如识别Selenium特征,或要求模拟真实用户行为。

  • 解决:
    • 模拟用户滚动行为:遍历房源时,滚动到当前卡片位置
      import time
      driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", item)
      time.sleep(0.5)  # 短暂停留模拟浏览
      
    • 绕过Selenium检测:使用undetected-chromedriver替代普通ChromeDriver
      import undetected_chromedriver as uc
      
      driver = uc.Chrome()
      driver.get("目标房源列表URL")
      

4. 目标元素在iframe或Shadow DOM中

若检查元素时发现MLS/价格处于iframe或Shadow DOM内,需先处理容器再爬取:

  • iframe处理:
    # 切换到目标iframe
    iframe = driver.find_element(By.CSS_SELECTOR, 'iframe.property-frame')
    driver.switch_to.frame(iframe)
    # 爬取元素后切回主文档
    driver.switch_to.default_content()
    
  • Shadow DOM处理:
    # 穿透Shadow DOM获取元素
    shadow_root = driver.execute_script("return document.querySelector('shadow-host').shadowRoot")
    price = shadow_root.find_element(By.CSS_SELECTOR, 'price-selector').text
    

调试建议

  1. 在爬取MLS/价格前添加driver.save_screenshot('debug.png'),查看页面渲染状态,确认元素是否存在;
  2. 在浏览器控制台用document.querySelectorAll('你的选择器')测试选择器有效性,排除语法错误。

内容的提问来源于stack exchange,提问作者D.Zou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:40:25