使用R的rvest与V8抓取JS渲染地块页面,获取全部地块数据问询
问题根源
- 你请求的是单页应用的初始静态骨架,地块数据、
parcel全局变量、div.owner节点都需要前端异步请求数据、执行JS渲染后才会生成,直接用read_html()拿到的内容里没有这些元素,你提取到的owners是无效值 - V8执行JS需要完整的运行上下文,你没有提前加载页面依赖的所有JS文件,直接执行不完整的代码片段自然会报
parcel未定义的错误
解决方案
优先选择接口抓取(效率最高):
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」请求,刷新页面后即可找到加载地块数据的后端接口,返回格式一般为JSON。你可以直接用
httr包的GET()方法请求该接口,解析后就能拿到全量地块数据,无需处理前端JS逻辑。
如果找不到接口,可使用无头浏览器渲染完整页面后提取数据,示例使用chromote包实现:
library(chromote) library(rvest) library(magrittr) # 启动无头浏览器实例 chrome_session <- ChromoteSession$new() # 跳转目标页面 chrome_session$Page$navigate("https://hosting.tighebond.com/plainfieldct_public/##info-address") # 等待JS执行和页面渲染完成,可替换为等待指定节点出现的逻辑提高稳定性 Sys.sleep(3) # 获取渲染完成的完整HTML内容 rendered_html <- chrome_session$Runtime$evaluate("document.documentElement.outerHTML")$result$value %>% read_html() # 提取业主信息 owners <- rendered_html %>% html_nodes("div.owner") %>% html_text() # 关闭浏览器实例 chrome_session$close()
全量爬取注意事项
- 若你找到的是列表接口,可直接获取全量数据;若需要遍历单个地块详情,可先抓取所有地块的唯一标识,循环拼接对应地址或模拟触发页面点击事件后再提取数据
- 请控制请求频率,避免对目标服务器造成过大压力导致IP被限制访问
内容的提问来源于stack exchange,提问作者sleepybun
相关产品推荐
相关产品推荐

