使用rvest::read_html爬取fincaraiz网页无法获取完整HTML及提取href失败
问题原因
目标页面采用*客户端动态渲染(CSR)*机制,你在浏览器检查元素里看到的完整DOM结构,是浏览器加载初始静态HTML后,通过JavaScript异步请求后台接口、动态生成的内容。rvest仅支持抓取初始静态HTML,无法解析执行JS生成动态内容,因此只能拿到不包含列表数据的基础HTML代码,自然提取不到对应href属性。
解决方案
有两种常见的解决路径,优先推荐第一种,效率更高:
方法1:直接调用后台数据接口
- 打开浏览器开发者工具(F12),切换到「网络」标签,筛选
Fetch/XHR类请求,刷新页面后逐一查看请求返回结果,就能找到返回房产列表数据的后台接口 - 直接请求该接口获取结构化JSON数据,不需要解析HTML,提取效率更高,也更稳定
方法2:使用支持JS渲染的工具加载页面
如果找不到可用接口,或需要获取渲染后的完整DOM结构,可以使用支持JS执行的无头浏览器工具加载页面,再用rvest解析,以下是chromote包的示例代码:
# 安装依赖包(首次使用需执行) # install.packages("chromote") # install.packages("rvest") library(chromote) library(rvest) # 启动无头浏览器实例 b <- ChromoteSession$new() # 加载目标页面 b$Page$navigate("https://www.fincaraiz.com.co/apartamentos-casas/venta/medellin?usado=true&pagina=1") # 等待页面动态渲染完成,可根据网络情况调整等待时长 Sys.sleep(3) # 获取渲染完成的完整HTML代码 full_html <- b$Runtime$evaluate("document.documentElement.outerHTML")$result$value %>% read_html() # 提取目标href属性 href_result <- full_html %>% html_elements("div article a") %>% html_attr("href") # 关闭浏览器实例 b$close()
注意事项
- 控制请求频率,避免短时间内发起大量请求触发网站反爬机制
- 遇到反爬限制时,可通过添加自定义请求头、设置随机等待间隔等方式规避
内容的提问来源于stack exchange,提问作者aquintero
相关产品推荐
相关产品推荐

