如何通过Shell脚本使用cUrl获取iframe内的响应数据
问题解答
问题1:仅通过Shell中的curl是否可以获取到iframe内的数据?如果无法通过Shell实现,请问有什么解决方案?
可以实现,不需要额外工具。
你当前单次curl请求拿到的是父页面内容,iframe的内容是浏览器加载完父页面后,单独请求iframe对应的URL才返回的,所以只要抓到iframe对应的请求地址,用curl分两步请求即可:
- 打开Chrome开发者工具的「网络」面板,过滤「文档」类型,手动在页面提交一次命令,找到除
scpictrl.htm之外的另一个文档请求,就是iframe的请求地址(通常为类似/response.htm的路径)。 - 请求时需要携带Cookie关联你的命令提交请求和结果查询请求,因为示波器接口会通过Session匹配同一用户的操作。
如果抓包发现页面是通过JS动态向iframe写入内容、没有单独的iframe请求,你可以直接抓JS调用的后端数据接口地址,用curl直接请求该接口即可,比解析页面更简单。
如果确实需要渲染JS才能拿到数据,也可以在Shell中安装无头浏览器工具(比如phantomjs、playwright-cli)实现,无需图形界面即可拿到渲染后的内容。
问题2:如果可以正常获取该数据,要如何从curl的返回结果中提取目标数据?
步骤1:用curl分两步请求获取完整数据
示例命令如下,先提交命令并保存Cookie,再请求iframe地址拿结果:
# 提交SCPI命令,保存Cookie到本地文件 curl -c osc_cookie.txt -X POST "http://192.xxx.xx.xxx/scpictrl.htm" --data "request=MEAS%3ARES%3AACT%3F%20RMS&cmd=Send" > /dev/null 2>&1 # 携带Cookie请求iframe地址,替换为你实际抓到的iframe路径 curl -b osc_cookie.txt "http://192.xxx.xx.xxx/替换为你的iframe路径" > response.tmp
步骤2:提取目标科学计数法数值
用grep正则匹配即可直接提取结果:
grep -oP '[+-]?\d+\.?\d*[Ee][+-]?\d+' response.tmp
直接输出的就是你需要的6.906319E-03这类数值。
如果是用无头浏览器的方案,直接在脚本中提取iframe的textContent输出即可,不需要额外解析。
内容的提问来源于stack exchange,提问作者Hsuan Chou
相关产品推荐
相关产品推荐

