使用rvest、httr抓取动态下拉菜单并提交表单获取计算结果求助
你用rvest::html_element提取不到下拉选项的核心原因是该页面为动态渲染页面,初始静态HTML中不包含品牌、型号的选项数据,这类数据是页面加载完成后通过异步接口拉取渲染的,rvest默认仅请求静态HTML资源,因此无法获取到动态加载的内容。
联动表单的通用设计逻辑
- 页面初始化后,前端单独向后端请求全量系统品牌数据,渲染到品牌下拉选择框
- 当用户选中指定品牌时,前端将选中的品牌ID作为参数,向后端请求该品牌关联的所有型号数据,渲染到型号下拉选择框
- 表单提交时,前端将5个字段的参数打包为POST请求发送到后端计算接口,拿到返回结果后渲染到页面展示
具体实现方案
方案1:直接调用后端接口(推荐)
操作效率更高,无需解析页面DOM,步骤如下:
- 打开浏览器开发者工具的「网络」面板,筛选「XHR/Fetch」类型的请求,手动操作一遍选品牌、选型号、提交表单的全流程,找到3个关键接口:全量品牌查询接口、指定品牌下型号查询接口、计算结果提交接口
- 用
httr::GET()请求品牌查询接口,用jsonlite::fromJSON()解析返回的JSON数据,即可得到所有品牌的名称和对应的唯一ID - 遍历所有品牌ID,每次将品牌ID作为请求参数调用型号查询接口,拿到对应品牌下的所有型号数据,存储为结构化列表
- 固定安装日期、邮政编码参数,将免责声明勾选参数设为
true,遍历所有品牌+型号组合,用httr::POST()将5个字段参数传入计算接口,解析返回结果即可得到所有组合的计算值
注意事项:
- 请求时需要带上和浏览器一致的
User-Agent、Cookie请求头,避免被后端拦截- 两次请求之间添加1-2秒的延迟,避免请求频率过高触发反爬规则
方案2:模拟浏览器操作(适合不想抓包的场景)
如果不想抓包分析接口,可以使用RSelenium这类浏览器自动化工具,它可以启动真实浏览器内核,等待页面动态内容加载完成后再提取元素,不会出现空列表的问题,缺点是运行速度比直接调用接口慢很多。
内容的提问来源于stack exchange,提问作者a_leemo
相关产品推荐
相关产品推荐

