无法从目标网站提取价格变量?怀疑代码中存在span嵌套问题
问题原因
- 核心原因是目标站点的价格数据为客户端JavaScript动态加载渲染生成,
rvest仅能抓取初始静态HTML,此时.price类节点为无内容的占位标签,提取自然返回空白。 - 就算拿到渲染完成的页面内容,
.price节点内部嵌套了多个带货币符号、价格单位、空格分隔符的子span标签,直接提取全文本后混杂大量非数字字符,直接调用as.numeric()会自动转换为NA。
解决办法
方案1:静态提取内嵌JSON数据(无需模拟浏览器,效率更高)
目标站点会把所有设备的初始数据存放在页面的<script>标签内嵌的JSON字符串中,直接用正则提取即可,不需要渲染页面:
library(rvest) library(stringr) library(jsonlite) url <- 'https://www.kimovil.com/en/compare-smartphones/f_min_dm+unveileddate.3,i_b+slug.samsung' webpage <- read_html(url) # 提取包含设备数据的script标签内容 script_content <- html_text(html_nodes(webpage, "script[type='text/javascript']")) %>% str_subset("window.__NUXT__") # 解析完整设备列表JSON,可同时获取型号、参数等多维度信息 full_data <- str_match(script_content, "window\\.__NUXT__\\=(.*?)\\;<")[,2] %>% fromJSON() # 提取价格字段,JSON层级可根据实际解析后的结构调整 device_cost <- full_data$data[[1]]$publicProductList$items$price %>% as.numeric()
方案2:用RSelenium模拟浏览器动态渲染后提取
如果需要模拟用户交互、处理更多滚动加载的内容,可以用RSelenium启动浏览器加载页面,等内容渲染完成后再提取,同时处理嵌套标签的文本清洗:
library(RSelenium) library(rvest) library(stringr) # 启动Chrome驱动(需提前安装对应版本的Chrome和chromedriver) driver <- rsDriver(browser = "chrome", chromever = "你的Chrome对应版本号") remDr <- driver$client remDr$navigate(url) # 等待页面价格元素加载完成,可根据网络情况调整等待时长 Sys.sleep(3) # 获取渲染后的完整页面源码 rendered_page <- read_html(remDr$getPageSource()[[1]]) # 提取.price节点文本,清洗非数字字符后转数值 device_cost <- html_nodes(rendered_page, ".price") %>% html_text() %>% str_remove_all("[^0-9\\.]") %>% # 只保留数字和小数点,可根据实际货币格式调整规则 as.numeric() # 关闭驱动进程 remDr$close() driver$server$stop()
注意事项
- 提取时注意处理不同区域的货币符号、千位分隔符,可根据实际返回的文本调整正则清洗规则。
- 频繁爬取建议添加随机请求间隔,避免触发站点反爬机制。
内容的提问来源于stack exchange,提问作者Naressh Thiagaraj
相关产品推荐
相关产品推荐

