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模拟真实浏览器加载页面:
前置准备:
- 安装Chrome浏览器
- 下载对应版本的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
相关产品推荐
相关产品推荐

