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

