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

Selenium点击动态楼层元素后页面未加载房源信息的问题

动态网页爬取问题:点击楼层后无法加载房源信息

我是web scraping新手,尝试从动态网站抓取公寓房源信息,已成功获取默认19层的数据,但点击已知有房源的楼层元素后,页面始终显示「There are no available apartments on this floor」,无法获取对应楼层的房源信息,怀疑点击操作未触发正确的动态加载。


当前代码

xpath = '//*[@id="mobile-floor-carousel-list"]/a[11]'
# 点击楼层
floor = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, xpath))).click()

print("clicked on page")

floorplans = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, "//div[@id='unit-list-items']"))
)
print("waited for page to load")

print(driver.find_element(By.XPATH,"//html").get_attribute('innerHTML'))

目标楼层元素HTML

<a href="#" class="skylease__toolbar-floor-link swiper-slide skylease__mobile-floor-link--has-units" data-js-hook="mobile-floor-selector" data-floor="14" style="width: 50.6154px; margin-right: 5px;"><div><span>Floor</span><span>14</span><span class="skylease-avail-count"><span data-floor="14" data-js-hook="available-unit-count">4</span> avail</span></div></a>

点击后返回的无房源innerHTML

</div>
   <div id="unit-list" class="skylease__unit-list">
   <p id="unit-list-message" class="skylease__unit-message">There are no available apartments on this floor.</p>
   <div class="skylease__unit-list-items" id="unit-list-items"></div>
      </div>

手动操作预期的含房源innerHTML

<div id="unit-list" class="skylease__unit-list">
                <p id="unit-list-message" class="skylease__unit-message" style="display: none;">There are no available apartments on this floor.</p>    
    <div class="skylease__unit-list-items" id="unit-list-items"><a href="#" class="skylease__unit-list-item skylease__unit-list-item--alt" data-unit="1504" style="display: block;">
        ....edited out for simplicity
        
                <div class="skylease__unit-list-item-info-wrap">
                    <div class="skylease__unit-list-item-info">
                        <div class="skylease__unit-list-item-details skylease__unit-list-item-details--unit">
                            #1504
        ...edited out for simplicity
                    <div class="skylease__unit-list-item-info">
                        <p class="skylease__unit-list-item-details">Studio</p>
                        <p class="skylease__unit-list-item-details">1 bath</p>
                        <p class="skylease__unit-list-item-details"></p>
                                            <p class="skylease__unit-list-item-details">512 sq. ft.</p>
                                        <p class="skylease__unit-list-item-details"></p>
                    </div>
        
                                    <div class="skylease__unit-list-item-info">
                            <p class="skylease__unit-list-item-details skylease__unit-list-item-details--price">
                                                        <span>1,807</span>
                                                            <span>3683</span>
                                                    </p>
                        </div>
                            </div>

解决方法

1. 确保元素可交互后再点击

presence_of_element_located仅保证元素存在DOM中,但可能未完全渲染无法触发点击逻辑,改用element_to_be_clickable:

floor = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, xpath))).click()

2. 等待真实房源加载完成

当前等待的unit-list-items空元素也会满足条件,需等待房源元素出现或无房源提示被隐藏:

# 方案1:等待无房源提示隐藏(针对有房源的楼层)
WebDriverWait(driver, 10).until(
    EC.invisibility_of_element_located((By.ID, "unit-list-message"))
)

# 方案2:等待房源链接出现
floorplans = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, "//div[@id='unit-list-items']/a"))
)

3. 模拟真实用户点击行为

部分网站会检测非真实交互,可添加滚动或用ActionChains模拟点击:

# 先滚动到元素位置
floor_element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, xpath))
)
driver.execute_script("arguments[0].scrollIntoView(true);", floor_element)
floor_element.click()

# 或者用ActionChains
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(floor_element).click().perform()

4. 跳过Selenium,直接请求API

动态网站的房源数据通常来自后端API,可通过浏览器F12的Network面板,筛选XHR/fetch请求,找到加载楼层数据的接口(比如/api/floors/14),直接用requests库请求获取JSON数据,效率更高且避免交互问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:44:59