r - 如何使用 rvest 获取从 Lux 到流明计算器的动态数据
问题描述
勒克斯到流明计算器提供勒克斯、流明、LED 光束角和表面到光的距离之间的关系。勒克斯和流明具有输入字段,而 LED 光束角度和从表面到光的距离具有滑动条来设置所需的值。
如果有人可以帮助我并解释(可能一步一步地)在给定指定的 LED 光束角度和从表面到光的距离值的情况下,如何使用 rvest 获得勒克斯或流明值,我将不胜感激。我使用 rvest 从网页中抓取静态数据,但缺乏通过特定表单提交在具有动态输入的网页上执行此操作的经验。
我使用以下代码从网页中提取表单,但似乎这不是正确的尝试:
library (rvest)
calculator_webpage <- read_html("https://www.bannerengineering.com/za/en/company/expert-insights/lux-lumens-calculator.html#")
calculator_webpage %>% html_node("form") %>% html_form()
解决方案
计算是在 Javascript 中在客户端完成的,特别是使用这些 JS 函数,(注意calculateLumens
和calculateLux
函数)。这就是为什么您在 html 本身中看不到任何内容(使用 rvest)。
代码可以很容易地在 R 中转换,如下所示:
convertDegreesToRadians <- function(angleInDegrees) {
return(angleInDegrees * pi / 180)
}
calculateLux <- function(lumens, surfaceAreaToIlluminate, distanceFromSurfaceToLight, beamAngleInDegrees) {
modifier <- calculateLuxLumensModifier(surfaceAreaToIlluminate, distanceFromSurfaceToLight, beamAngleInDegrees)
return(lumens / modifier)
}
calculateLuxLumensModifier <- function(surfaceAreaToIlluminate, distanceFromSurfaceToLight, beamAngleInDegrees) {
beamAngleInRadians <- convertDegreesToRadians(beamAngleInDegrees)
modifier <- surfaceAreaToIlluminate * distanceFromSurfaceToLight^2 * 2 * pi * (1 - cos(beamAngleInRadians / 2))
return(modifier)
}
calculateLumens <- function(lux, surfaceAreaToIlluminate, distanceFromSurfaceToLight, beamAngleInDegrees) {
modifier = calculateLuxLumensModifier(surfaceAreaToIlluminate, distanceFromSurfaceToLight, beamAngleInDegrees)
return(lux * modifier)
}
getLuxFromLumens <- function(lumens, distanceFromSurfaceToLight, beamAngleInDegrees){
calLux <- calculateLux(lumens,1,distanceFromSurfaceToLight,beamAngleInDegrees)
return(round(calLux))
}
getLumensFromLux <- function(lux,distanceFromSurfaceToLight,beamAngleInDegrees){
calLumen <- calculateLumens(lux,1,distanceFromSurfaceToLight,beamAngleInDegrees)
return(round(calLumen))
}
calculateBeamWidth <- function(distanceFromSurfaceToLight, beamAngleInDegrees) {
beamAngleInRadians <- convertDegreesToRadians(beamAngleInDegrees)
return(round(2 * distanceFromSurfaceToLight * tan(beamAngleInRadians / 2), digits=2))
}
# get lux from lumens, distanceFromSurfaceToLight, beamAngleInDegrees
print(getLuxFromLumens(lumens = 1000, distanceFromSurfaceToLight= 0.1, beamAngleInDegrees=120))
# get luments from lux, distanceFromSurfaceToLight, beamAngleInDegrees
print(getLumensFromLux(lux = 1000, distanceFromSurfaceToLight= 0.1, beamAngleInDegrees=120))
# get beam width from distanceFromSurfaceToLight, beamAngleInDegrees
print(calculateBeamWidth(distanceFromSurfaceToLight = 0.1,beamAngleInDegrees = 120))
推荐阅读
- sql - 根据 Oracle 版本执行查询
- c# - 如何修复在 LevelValue 更改时生成对象的减少时间
- php - 如何从 HTML 表中获取数据
- memory - 为什么 Racket 在这里以不同的值 (current-memory-use) 开始?
- algorithm - 无法为 while & if 语句找到正确的 Big O
- javascript - 如何避免登录用户通过控制台使用 ajax?
- c# - 将 Asp.net Core API 的结果传递给 Angular
- xml - Adobe LiveCycle:使用 XSLT 进行 XML 到 XML 的转换
- c - 如何查找指针错误?
- python - 设计一个python类