这是我的基本网址:https://obchody.heureka.sk/?f=1 这包含在线商店列表,我想抓取他们的基本信息。然而,该页面上不存在 url,因为这是由 java 脚本处理的。我需要单击每个在线商店徽标或名称,这会将我重定向到商店的主页,我可以从那里获取网址。
我在执行点击时遇到问题;我使用 Rvest read_html_live() 和 Selenider elem_click() 都没有成功。
我的 Rvest read_html_live() 代码:
url <- "https://obchody.heureka.sk/?f=1"
page <- read_html_live(url)
page$click(".c-shops-table__cell--name a", n_clicks = 1)
Selenider 代码
selenider_session()
selenider::open_url(url)
s(".c-shops-table__cell--name a") %>% elem_click(js = TRUE, timeout = NULL)
我的期望是我应该被重定向到在线商店主页;但以上都不起作用。 请问我做错了什么?
此示例中的 URL 未使用 JavaScript 进行映射/翻译,它是服务器端 HTTP 重定向。因此,您可以使用
rvest
收集 URL,迭代 URL 列表(例如,使用 map()
),使用 httr
/httr2
在禁用重定向的同时发出请求,并从响应标头收集实际目标位置:
library(rvest)
library(httr2)
library(purrr)
# collect redirect location from response header
get_redirect <- function(url_, rate = 1){
request(url_) |>
req_options(followlocation = FALSE) |>
req_throttle(1) |>
req_perform() |>
resp_header("Location")
}
urls <-
read_html("https://obchody.heureka.sk/?f=1") |>
html_elements(".c-shops-table__cell--name a") |>
html_attr("href")
head(urls)
#> [1] "https://www.heureka.sk/exit/alza-sk/?z=4"
#> [2] "https://www.heureka.sk/exit/mall-sk/?z=4"
#> [3] "https://www.heureka.sk/exit/datart-sk/?z=4"
#> [4] "https://www.heureka.sk/exit/kaufland-sk/?z=4"
#> [5] "https://www.heureka.sk/exit/andreashop-sk/?z=4"
#> [6] "https://www.heureka.sk/exit/mironetcz-sk/?z=4"
# get redirects for 1st 5 urls
urls[1:5] |>
set_names() |>
map_chr(get_redirect, .progress = TRUE) |>
tibble::enframe(name = "url", value = "redirect")
#> # A tibble: 5 × 2
#> url redirect
#> <chr> <chr>
#> 1 https://www.heureka.sk/exit/alza-sk/?z=4 http://www.alza.sk?hgtid=7d6b6…
#> 2 https://www.heureka.sk/exit/mall-sk/?z=4 http://www.mall.sk?hgtid=da6c5…
#> 3 https://www.heureka.sk/exit/datart-sk/?z=4 https://www.datart.sk/?hgtid=f…
#> 4 https://www.heureka.sk/exit/kaufland-sk/?z=4 https://www.kaufland.sk?hgtid=…
#> 5 https://www.heureka.sk/exit/andreashop-sk/?z=4 http://www.andreashop.sk?hgtid…
创建于 2024-05-22,使用 reprex v2.1.0
我猜你的
page$click()
会失败,因为你的第一个请求遇到了cookie墙(请检查page$view()
)和/或如果选择器返回多个匹配项,page$click()
实际上不起作用。