You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R网页爬取求助:SelectorGadget无法选中节点、代码无返回

解决alkoutlet.lv朗姆酒板块爬取无结果的问题

问题原因

  • 该网站采用JavaScript动态渲染产品内容,rvest::read_html()只能抓取初始静态HTML,无法获取JS加载后的产品节点。
  • 网站可能拦截了无浏览器标识的请求,原始请求未携带必要请求头,被识别为爬虫。

解决方案

方法1:添加浏览器请求头(优先尝试)

通过httr包模拟浏览器请求,携带User-Agent标识,再将响应内容传给rvest解析。

修改后的代码:

# 安装并加载所需包
install.packages(c('rvest', 'stringr', 'magrittr', 'tidyverse', 'httr'))
library(rvest)
library(stringr)
library(magrittr)
library(tidyverse)
library(httr)

# 设置请求头,模拟Chrome浏览器
headers <- add_headers(
  `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
)

url_base <- "https://alkoutlet.lv/dzerieni/stiprie/rums.html?page="
l_out <- 2
urls <- paste0(url_base, seq(1, by = 1, length.out = l_out))

# 修改解析函数,先通过httr获取页面
parse_overview <- function(url){
  # 发送请求,获取响应
  response <- GET(url, headers)
  # 解析响应为HTML
  x <- content(response, "html")
  
  tibble(
    title = html_text(html_nodes(x, '.ProductCard-Name_isLoaded'), trim = TRUE),
    price = html_text(html_nodes(x, '.ProductCard-PriceWrapper'), trim = TRUE),
    description = html_text(html_nodes(x, '.ProductCard-ShortSpecification'), trim = TRUE),
    link = str_trim(html_attr(html_nodes(x, '.ProductCard-Name_isLoaded'), 'href')) %>% 
      paste("https://alkoutlet.lv", ., sep = "")
  )
}

# 爬取并添加延迟,避免请求过于频繁
Result <- urls %>% 
  map(function(url){
    Sys.sleep(2) # 每次请求间隔2秒
    parse_overview(url)
  }) %>% 
  map_df(bind_rows)

View(Result)

方法2:使用RSelenium模拟完整浏览器(处理动态渲染)

如果方法1无效,说明网站依赖JS渲染内容,需要用RSelenium模拟真实浏览器加载页面:

前置准备:

  1. 安装Chrome浏览器
  2. 下载对应版本的ChromeDriver,并将其路径添加到系统环境变量,或在代码中指定路径。

修改后的代码:

# 安装并加载包
install.packages(c('rvest', 'stringr', 'magrittr', 'tidyverse', 'RSelenium'))
library(rvest)
library(stringr)
library(magrittr)
library(tidyverse)
library(RSelenium)

# 启动Chrome浏览器驱动(替换chromever为你的Chrome版本号)
driver <- rsDriver(browser = "chrome", chromever = "118.0.5993.70")
remDr <- driver[["client"]]

url_base <- "https://alkoutlet.lv/dzerieni/stiprie/rums.html?page="
l_out <- 2
urls <- paste0(url_base, seq(1, by = 1, length.out = l_out))

parse_overview <- function(url){
  # 访问目标页面
  remDr$navigate(url)
  # 等待内容加载(可根据实际情况调整等待时间)
  Sys.sleep(3)
  # 获取页面源码
  page_source <- remDr$getPageSource()[[1]]
  x <- read_html(page_source)
  
  tibble(
    title = html_text(html_nodes(x, '.ProductCard-Name_isLoaded'), trim = TRUE),
    price = html_text(html_nodes(x, '.ProductCard-PriceWrapper'), trim = TRUE),
    description = html_text(html_nodes(x, '.ProductCard-ShortSpecification'), trim = TRUE),
    link = str_trim(html_attr(html_nodes(x, '.ProductCard-Name_isLoaded'), 'href')) %>% 
      paste("https://alkoutlet.lv", ., sep = "")
  )
}

# 爬取数据
Result <- urls %>% 
  map(function(url){
    Sys.sleep(2)
    parse_overview(url)
  }) %>% 
  map_df(bind_rows)

# 关闭浏览器驱动
remDr$close()
driver$server$stop()

View(Result)

注意事项

  • 爬取时添加Sys.sleep()设置请求间隔,避免给服务器造成过大压力,同时降低被封禁的风险。
  • 定期检查网站的robots.txt,确保爬取行为符合网站规则。

内容的提问来源于stack exchange,提问作者RGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:55:25