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

