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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:55:31