使用 R 进行网页抓取:read_html_live() - 正确的 css 选择器来执行点击

问题描述 投票:0回答:1

这是我的基本网址: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)

我的期望是我应该被重定向到在线商店主页;但以上都不起作用。 请问我做错了什么?

r web-scraping rvest
1个回答
0
投票

此示例中的 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()
实际上不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.