首页 > 解决方案 > 如何使用 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()

标签: rweb-scrapingweb-crawlerrvest

解决方案


计算是在 Javascript 中在客户端完成的,特别是使用这些 JS 函数,(注意calculateLumenscalculateLux函数)。这就是为什么您在 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))

在 repl.it 上运行此示例


推荐阅读