如何用R的rvest包抓取Naver电影数据并导出为CSV?
问题分析与修复方案
原代码存在多处语法和逻辑错误,导致无法运行,下面逐一修正并实现你的抓取需求:
原代码核心问题
- 管道运算符
%>%被拆分为两行,属于语法错误 - 直接对XML节点集合使用
substr提取电影编号,方法错误,应先获取详情页链接再解析编号 - 试图对字符向量调用
html_nodes,该函数仅适用于HTML文档或节点对象 - 数据框构造逻辑混乱,完全不符合需求
修正后的完整代码
library(rvest) library(dplyr) library(purrr) # 1. 抓取排名页的电影标题与编号 base_url <- "https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20220502" webpage <- read_html(base_url) # 提取电影标题、详情页链接,并解析出电影编号 movie_info <- webpage %>% html_nodes(".tit5 > a") %>% tibble( title = html_text(.), href = html_attr("href") ) %>% mutate(code = stringr::str_extract(href, "code=\\d+") %>% stringr::str_remove("code=")) %>% slice(1:100) # 取前100部电影 # 2. 定义函数:根据编号抓取单部电影的详情信息 get_movie_details <- function(movie_code) { detail_url <- paste0("https://movie.naver.com/movie/bi/mi/point.nhn?code=", movie_code) detail_page <- read_html(detail_url) # 提取电影详情信息(根据页面结构调整选择器,适配32项信息的抓取) details <- detail_page %>% html_nodes(".info_spec dl") %>% html_text2() %>% stringr::str_split_fixed(":", 2) %>% as.data.frame(stringsAsFactors = FALSE) %>% tidyr::pivot_wider(names_from = V1, values_from = V2) # 补充电影编号和标题 details$code <- movie_code details$title <- movie_info$title[movie_info$code == movie_code] return(details) } # 3. 批量抓取所有电影详情(添加延迟避免反爬) movie_data <- map_dfr(movie_info$code, function(code) { Sys.sleep(1) # 每抓取一个页面暂停1秒 get_movie_details(code) }) # 4. 导出为CSV文件 write.csv(movie_data, "movie_data.csv", row.names = FALSE)
关键说明
- 用
html_attr("href")正确获取详情页链接,再通过字符串提取工具解析电影编号,比手动截取更稳定 - 封装单部电影抓取逻辑为函数,方便批量处理
- 添加
Sys.sleep(1)控制请求频率,避免触发网站反爬机制 - 用
map_dfr自动合并所有电影的详情数据为标准数据框,无需手动构造矩阵
内容的提问来源于stack exchange,提问作者R starter
相关产品推荐
相关产品推荐

