R脚本抓取otodom.pl房产数据时XPath仅返回6条结果的原因?
问题分析与解决办法
你遇到的情况,大概率是以下原因导致的:
1. 页面采用动态懒加载,静态爬取仅能获取初始渲染内容
otodom.pl这类房产网站常用懒加载机制——页面首次加载只渲染前6条房源,剩余30条需要触发滚动或JS事件才会加载。你用rvest这类静态爬取工具(或XPath Playground直接解析静态HTML),只能拿到页面初始渲染的内容,自然只能得到6条结果。
2. 动态生成的CSS类名存在差异
你使用的css-qch36y e1n6ljqa6这类带随机后缀的类名,通常由CSS-in-JS框架生成,可能仅前6条房源的标题h3使用该类,后续加载的房源标题类名已发生变化,或节点结构不同。
解决思路
方法一:使用支持JS渲染的爬取工具
在R中可以用chromote或RSelenium模拟浏览器行为,让页面完整加载所有房源后再解析:
library(chromote) # 启动浏览器会话 b <- ChromoteSession$new() # 访问目标页面 b$Page$navigate("https://www.otodom.pl/pl/oferty/sprzedaz/mieszkanie/krakow?distanceRadius=0&page=1&limit=36&by=DEFAULT&direction=DESC&viewType=listing") # 等待页面初始加载完成 b$Page$waitForLoadEvent() # 模拟滚动到底部触发懒加载 b$Runtime$evaluate("window.scrollTo(0, document.body.scrollHeight);") Sys.sleep(2) # 预留加载时间 # 获取完整页面HTML html <- b$Page$getDocument()$result$root$children[[1]]$outerHTML # 解析标题 library(rvest) titles <- read_html(html) %>% html_elements(xpath = "//h3[contains(@class, 'e1n6ljqa6')]/text()") %>% html_text()
方法二:直接调用网站API接口
打开浏览器开发者工具(F12),切换到Network标签,刷新页面后查找XHR/fetch请求,会发现网站实际通过API接口获取房源数据(多为JSON格式)。直接请求API比爬HTML更高效,也能避免加载问题:
library(httr) library(jsonlite) # 构造API请求参数 url <- "https://www.otodom.pl/api/v1/offers" params <- list( distanceRadius = 0, page = 1, limit = 36, by = "DEFAULT", direction = "DESC", viewType = "listing", city = "krakow", type = "mieszkanie", transaction = "sprzedaz" ) # 发送请求并解析数据 response <- GET(url, query = params) data <- fromJSON(content(response, "text")) # 提取所需字段 titles <- data$items$title prices <- data$items$price$value per_sqm_prices <- data$items$price$perSqm areas <- data$items$area
方法三:优化XPath表达式
如果坚持静态爬取,可换用更稳定的定位逻辑,比如避开动态类名,使用语义化属性或父级稳定类:
//div[contains(@class, 'offer-item')]//h3/text()
或匹配类名的固定部分:
//h3[contains(@class, 'e1n6ljqa6')]/text()
内容的提问来源于stack exchange,提问作者gallez
相关产品推荐
相关产品推荐

