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

如何用Mozilla工具抓取Century21房产列表原始数据?代码异常排查

问题分析与解决方案

核心问题

你的代码无法获取数据的主要原因:

  • 你使用的房源容器class包含动态生成的专属ID(property-card-C2183089596),这是单个房源的唯一标识,并非所有房源的通用类名,导致findAll无法匹配到任何元素。
  • 旧版ChromeDriver初始化方式已被废弃,新版本Selenium会报错。
  • 固定sleep(3)的等待方式不稳定,可能页面还未完全加载就开始解析。

修正后的代码

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 bs4 import BeautifulSoup
from selenium.webdriver.chrome.service import Service

url = 'https://www.century21.com/real-estate/long-island-city-ny/LCNYLONGISLANDCITY/'

# 初始化ChromeDriver(适配新版本Selenium)
service = Service('C:\\Utility\\chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.get(url)

# 显式等待,直到房源容器加载完成(比固定sleep更稳定)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'property-card')))

content = driver.page_source
soup = BeautifulSoup(content, 'html.parser')

# 遍历所有房源容器(用通用类名,去掉动态ID)
for property_card in soup.findAll('div', class_='infinite-item property-card clearfix'):
    # 提取价格
    price = property_card.find('a', class_='listing-price').text.strip() if property_card.find('a', class_='listing-price') else 'N/A'
    # 提取状态(FOR SALE)
    status = property_card.find('div', class_='property-card-status').text.strip() if property_card.find('div', class_='property-card-status') else 'N/A'
    # 提取地址详情
    address_block = property_card.find('div', class_='property-card-primary-info')
    street_addr = city_zip = 'N/A'
    if address_block:
        street_addr = address_block.find('div', class_='property-card-address').text.strip() if address_block.find('div', class_='property-card-address') else 'N/A'
        city_zip = address_block.find('div', class_='property-card-city').text.strip() if address_block.find('div', class_='property-card-city') else 'N/A'
    # 提取户型/面积
    details = property_card.find('div', class_='property-card-details')
    beds = baths = sqft = 'N/A'
    if details:
        for item in details.find_all('div', class_='property-card-detail-item'):
            label = item.find('span', class_='property-card-detail-label').text.strip()
            value = item.find('span', class_='property-card-detail-value').text.strip()
            if label == 'Beds':
                beds = f'{value} beds'
            elif label == 'Baths':
                baths = f'{value} baths'
            elif label == 'Sq. Ft.':
                sqft = f'{value} sq. ft'
    # 提取代理信息
    agent_info = property_card.find('div', class_='property-card-broker').text.strip() if property_card.find('div', class_='property-card-broker') else 'N/A'
    
    # 按要求格式输出
    print(f"{status}\n{price}\n{beds}\n{baths}\n{sqft}\n{street_addr}\n{city_zip}\n{agent_info}\n")
    print("##########################################\n")

driver.quit()

关键优化点

  • 使用通用类名定位房源容器,避免动态ID的影响。
  • 改用WebDriverWait显式等待,确保页面元素加载完成后再解析。
  • 适配新版本Selenium的ChromeDriver初始化方式(Service类)。
  • 增加字段缺失的容错处理,避免程序崩溃。
  • 完整提取你需要的所有字段(状态、价格、户型、面积、地址、代理)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:00:58