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

R语言rvest包爬取sreality.cz页面返回空数据框解决方案问询

失败原因
  • CSS选择器使用错误:多类名匹配时不能用空格分隔,空格代表父子节点层级关系,同时匹配两个类的正确写法为.类名1.类名2,你原有代码的选择器写法无法命中目标节点。
  • 站点为动态渲染架构:该页面采用Angular框架开发,所有房源数据由JS脚本动态加载生成,rvest的read_html()仅能获取未经过JS渲染的原始静态HTML,原始HTML中不存在你要提取的房源节点,这是返回空白数据框的核心原因。
可落地的爬取方案

方案1:直接调用后端数据接口(优先推荐)

站点本身会通过API接口拉取房源JSON数据,你可以直接请求该接口获取结构化数据,无需解析HTML,爬取效率最高。参考代码如下:

library(httr)
library(jsonlite)
library(dplyr)

# 构造接口请求参数,region参数对应布尔诺地区,可按需调整页码、每页数量等参数
req <- GET(
  url = "https://www.sreality.cz/api/cs/v2/estates",
  query = list(
    category_main_cb = 1,
    category_type_cb = 1,
    locality_region_id = 10,
    per_page = 20,
    page = 1
  )
)

# 解析返回的JSON数据
res_json <- content(req, as = "text", encoding = "UTF-8") |> fromJSON()

# 提取房源名称和价格
flat <- res_json$`_embedded`$estates |>
  transmute(
    name = name,
    price = price
  )

方案2:使用无头浏览器渲染后提取

如果你需要直接解析渲染后的页面DOM,可以使用RSelenium等工具模拟浏览器运行,等待页面JS渲染完成后再提取元素,参考代码如下:

library(RSelenium)
library(rvest)
library(dplyr)

# 启动无头Chrome驱动,chromever参数需替换为你本地安装的Chrome对应版本号
driver <- rsDriver(browser = "chrome", chromever = "你的本地Chrome版本号", verbose = F, port = 4567L)
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate("https://www.sreality.cz/hledani/prodej/byty/brno")
# 等待页面渲染完成,可根据网络情况调整等待时长
Sys.sleep(3)

# 获取渲染后的页面源码
page <- read_html(remDr$getPageSource()[[1]])

# 用正确的选择器提取数据
name <- page %>% html_elements(".name.ng-binding") %>% html_text()
price <- page %>% html_elements(".norm-price.ng-binding") %>% html_text()

flat = data.frame(name, price, stringsAsFactors = FALSE)

# 操作完成后关闭驱动释放资源
remDr$close()
driver$server$stop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:36:05