我试图从一个包含leaflet
Map(osm数据)的网站上抓取标记坐标。我一直在网上搜索答案,由于网站的动态特性,对解析的html的简单查询似乎是不够的。因此我一直在使用RSelenium
。在查看html并使用ChatGPT之后,我已经走了这么远:
library(RSelenium)
library(rvest)
library(xml2)
remote_driver <- rsDriver(browser = "firefox",
chromever = NULL,
verbose = FALSE,
port = 4445L)
remDr <- remote_driver$client
remDr$navigate("https://www.hejfish.com/d/1356-strobl-wasser-fliegenstrecke-traun")
# Scroll to the end of the page to trigger marker loading
remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);")
map_markers <- remDr$findElements(using = "css", value = ".MapIcons__marker_icon___vDTMo")
字符串
ChatGPT建议我像这样提取坐标:
coordinates <- lapply(map_markers, function(marker) {
lat <- marker$getElementAttribute("data-lat")$value
lon <- marker$getElementAttribute("data-lon")$value
c(lat = as.numeric(lat), lon = as.numeric(lon))
})
型
不幸的是,这不起作用:Error: attempt to apply non-function
。我假设提取的元素中没有名为"data-lat"
或"data-lon"
的属性。然而,通过检查网站的html,我找不到任何看起来甚至模糊不清的标记代码中的坐标。受this帖子的启发,我还检查了网络选项卡,并能够找到边界框的坐标,但不是为这两个标记。其他posts谈到隐藏在脚本标记中的信息,等等。但这超出了我的能力。
任何帮助刮坐标将不胜感激!
1条答案
按热度按时间thigvfpy1#
这里有一种方法来解决这个问题,注意,它涉及一个API键,在这个例子中它被截断了,所以您需要自己提取它。
我会先在dev.tools的网络标签中使用一些搜索字符串。传单标记弹出窗口包括GoogleMap链接,这可能很方便:
x1c 0d1x的数据
链接本身很可能是由JavaScript生成的,但坐标值可能是按原样传输的;在这里太具体可能不起作用,所以让我们只搜索纬度
48.235585
。此外,确保所有请求都被捕获,即在需要时刷新页面。这将引导我们到api.hejfish.com/fisher/areas/1356/map
API端点:的
我们可以尝试打开该URL,但即使在同一个浏览器会话中,我们也会遇到错误403 - Zugriff verweigert。当检查请求头时,会设置几个会话cookie和额外的头,最明显的是
X-Api-Key
。只是为了检查我们是否可以自己复制该请求,让我们将其复制为cURL命令:我们可以通过命令行使用它,或者尝试通过https://curlconverter.com/r/或类似的工具将其转换为R或Python,但让我们看看
httr2::curl_translate()
是否可以处理这个问题:字符串
看上去很结实!使用完整的API键,它实际上完成状态 200 OK。我们可以这样保留它,或者可能稍微修剪一下,为了处理JSON响应,我们可以使用
httr2::resp_body_json()
:型