求助:使用R从reiwa租房页面的Property trends图表提取时间序列数据
提取reiwa.com.au租房趋势图表的时间序列数据
问题原因
rvest直接爬取不到数据,是因为页面的Property trends图表是通过JavaScript动态渲染的,静态HTML源码里并不包含图表的原始数据,rvest只能获取初始加载的静态内容,所以拿不到目标时间序列。
解决方案1:用RSelenium模拟浏览器渲染页面
RSelenium可以模拟真实浏览器加载页面,等待JS执行完成后再提取数据,步骤如下:
- 安装依赖包并配置浏览器驱动(以Chrome为例):
install.packages("RSelenium") # 确保ChromeDriver已安装并添加到系统PATH,或通过rsDriver自动下载匹配版本
- 编写代码提取数据:
library(RSelenium) library(rvest) # 启动Chrome驱动(随机端口避免冲突) driver <- rsDriver(browser = "chrome", port = sample(4000:5000, 1)) remDr <- driver[["client"]] # 访问目标页面 remDr$navigate("https://reiwa.com.au/rent/") # 等待图表加载完成(根据网络情况调整等待时间) Sys.sleep(6) # 提取Highcharts图表的时间序列数据(匹配"Property trends"标题的图表) chart_series <- remDr$executeScript( "return window.Highcharts.charts.find(c => c.title.textStr === 'Property trends').series.map(s => ({ series_name: s.name, time_series: s.data.map(d => [new Date(d.x).toISOString().slice(0,10), d.y]) }));" ) # 关闭浏览器和驱动 remDr$close() driver$server$stop() # 查看提取的两组时间序列数据 print(chart_series)
解决方案2:直接调用网站的API接口(更高效)
通过浏览器抓包可以找到图表数据的来源API,跳过页面渲染直接请求数据:
抓包找API:
- 打开浏览器开发者工具(F12)→ 切换到「Network」标签→ 刷新页面
- 筛选「XHR」类型请求,查找包含趋势数据的接口(比如名称含
trend或rent的请求)
编写代码请求API:
library(httr) library(jsonlite) # 替换为抓包得到的真实API地址 api_url <- "https://reiwa.com.au/api/v1/rent/trends" # 模拟浏览器请求头,避免被反爬拦截 headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer" = "https://reiwa.com.au/rent/" ) # 发送请求并解析JSON数据 response <- GET(api_url, headers) trend_data <- fromJSON(content(response, "text", encoding = "UTF-8")) # 提取两组时间序列数据 series_1 <- trend_data$data$series[[1]] series_2 <- trend_data$data$series[[2]] print(series_1) print(series_2)
注意事项
- 网站可能会更新API接口或添加反爬机制,若API请求失败,需重新抓包确认接口地址和请求参数
- 频繁请求可能会被网站封禁IP,建议添加请求间隔或使用代理
- RSelenium的驱动版本需与浏览器版本匹配,避免出现启动失败问题
内容的提问来源于stack exchange,提问作者Zac
相关产品推荐
相关产品推荐

