如何使用rvest提取指定HTML节点?网页爬取问题求助
解决Trek自行车页面爬取问题
1. 无法提取产品名称的原因及解决方法
你遇到的{xml_nodeset (0)}问题,主要是两个原因:
- 网站拦截了默认爬虫请求头(
rvest的read_html默认UA会被识别为非浏览器请求) - 目标节点的类名或页面结构已发生变化
修复后的产品名称爬取代码
先通过httr添加浏览器请求头,模拟正常访问:
library(tidyverse) library(rvest) library(httr) url <- "https://www.trekbikes.com/us/en_US/bikes/road-bikes/performance-road-bikes/madone/madone-slr/madone-slr-9-etap-gen-7/p/37420" # 模拟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" ) # 发送请求并解析页面 page <- GET(url, headers) %>% content("text") %>% read_html() # 提取产品名称(当前页面实际对应节点为h1.product-title) product_name <- page %>% html_nodes("h1.product-title") %>% html_text(trim = TRUE) product_name
如果上述方法仍无法获取内容,说明页面是JS动态渲染的,需要用RSelenium模拟浏览器加载:
library(RSelenium) # 启动Chrome浏览器驱动(需提前安装ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] remDr$navigate(url) page_source <- remDr$getPageSource()[[1]] %>% read_html() product_name <- page_source %>% html_nodes(".buying-zone__title") %>% html_text(trim = TRUE) # 关闭驱动 remDr$close() driver$server$stop()
2. 爬取其他字段的方法
年份
可从产品名称或meta标签提取:
# 从产品名称正则提取年份 year <- str_extract(product_name, "\\d{4}") # 或从meta标签提取 year <- page %>% html_nodes('meta[property="product:release_date"]') %>% html_attr("content") %>% str_sub(1,4)
价格
价格对应.product-price类节点:
price <- page %>% html_nodes(".product-price") %>% html_text(trim = TRUE)
可选颜色
颜色选项在.color-swatch__label类中:
colors <- page %>% html_nodes(".color-swatch__label") %>% html_text(trim = TRUE) %>% discard(is_empty)
产品规格
规格存储在.specs-table表格中,可提取为数据框:
specs_table <- page %>% html_nodes(".specs-table") %>% html_table(header = TRUE) %>% .[[1]] %>% rename(Spec = 1, Value = 2)
注意事项
- 爬取前需查看网站的robots.txt文件,确保允许爬取目标页面
- 不要频繁发送请求,避免被网站封禁IP
- 网站结构可能随时变化,需定期检查节点选择器是否有效
内容的提问来源于stack exchange,提问作者The Rookie
相关产品推荐
相关产品推荐

