当前位置: 首页 > news >正文

R语言中的rvest库写个视频爬虫通用代码

朋友让我用R语言的rvest库写一个通用的视频爬虫代码示例。首先,我需要回忆一下rvest库的主要功能,它主要是用来做网页抓取和解析的,类似于Python的BeautifulSoup。但是视频爬虫的话,可能需要处理动态加载的内容,或者找到视频的直链地址,这可能有点挑战性,但是总体来说还是需要点水平的。

在这里插入图片描述

以下是一个使用 R 语言 rvest 库编写的通用视频爬虫代码示例,包含详细注释和注意事项:

# 加载必要库
library(rvest)  # 网页抓取
library(httr)   # 处理HTTP请求
library(tools)  # 处理文件扩展名

# 设置通用视频爬虫函数
video_crawler <- function(
  url,                  # 目标页面URL
  video_selector,       # 视频链接的CSS选择器 (e.g., "video source", ".video-link")
  referer = NULL,       # 需要设置的Referer头
  file_prefix = "video",# 保存文件前缀
  delay = 1             # 请求延迟(秒,防止被封)
{
  # 设置浏览器标识
  user_agent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
  
  # 发送HTTP请求
  response <- GET(url, add_headers(
    'User-Agent' = user_agent,
    'Referer' = ifelse(is.null(referer), url, referer)
  ))
  
  # 检查响应状态
  if (status_code(response) != 200) {
    stop(paste("请求失败,状态码:", status_code(response)))
  }
  
  # 解析网页内容
  page <- content(response, as = "parsed")
  
  # 提取视频链接
  video_elements <- html_nodes(page, video_selector)
  video_links <- html_attr(video_elements, "src")
  
  # 处理相对链接
  video_links <- url_absolute(video_links, url)
  
  # 去重处理
  video_links <- unique(video_links)
  
  # 检查是否找到视频
  if (length(video_links) == 0) {
    stop("未找到视频链接,请检查选择器设置")
  }
  
  # 创建保存目录
  dir.create("downloads", showWarnings = FALSE)
  
  # 下载视频
  for (i in seq_along(video_links)) {
    tryCatch({
      # 获取视频文件信息
      video_url <- video_links[i]
      file_ext <- file_ext(video_url)
      
      # 生成文件名
      filename <- sprintf("downloads/%s_%03d.%s", 
                         file_prefix, i, 
                         ifelse(nchar(file_ext) > 0, file_ext, "mp4"))
      
      # 添加延迟
      Sys.sleep(delay)
      
      # 下载文件
      message(sprintf("正在下载第 %d 个视频:%s", i, video_url))
      GET(video_url, 
          add_headers(Referer = url),
          write_disk(filename, overwrite = TRUE),
          user_agent(user_agent))
      
    }, error = function(e) {
      message(sprintf("下载失败:%s", e$message))
    })
  }
  
  message(sprintf("\n成功下载 %d/%d 个视频", 
                 sum(file.exists(sprintf("downloads/%s_%03d.*", file_prefix, seq_along(video_links)))),
                 length(video_links)))
}

# 使用示例 (需要替换实际参数)
# video_crawler(
#   url = "https://example.com/videos",
#   video_selector = "video source",  # 根据目标网站结构调整
#   referer = "https://example.com/", # 有些网站需要验证来源
#   delay = 2  # 更长的延迟更安全
# )

重要说明:

  1. 选择器选择
  • 视频链接可能位于不同位置,常见位置:
    • <video> 标签的 src 属性
    • <source> 标签的 src 属性
    • JavaScript 动态加载数据(需要配合RSelenium)
  • 使用浏览器开发者工具检查元素
  1. 动态内容处理
# 如需处理JavaScript动态加载内容,建议配合RSelenium:
library(RSelenium)
remDr <- remoteDriver(browserName = "chrome")
remDr$open()
remDr$navigate(url)
page <- remDr$getPageSource()[[1]] %>% read_html()
  1. 反爬虫策略
  • 适当增加delay参数
  • 使用代理服务器:
response <- GET(url, use_proxy("http://proxy.com:8080"))
  1. 法律声明
  • 使用前务必检查目标网站的robots.txt
  • 遵守网站的服务条款和相关法律法规
  • 尊重版权和隐私保护
  1. 扩展功能建议
  • 添加自动识别文件扩展名功能
  • 支持断点续传
  • 添加下载进度条
  • 支持代理池和User-Agent轮换

注意:实际使用时需要根据目标网站的具体结构调整选择器和其他参数,某些网站可能需要解析JavaScript或处理视频流分段(m3u8)等复杂情况。

相关文章:

  • 蓝桥杯补题
  • (1)英特尔 RealSense T265(三)
  • linux环境中部署node环境运行node应用
  • 重温hot100-day2
  • dav_1_MySQL数据库排查cpu消耗高的sql
  • C语言for循环嵌套if相关题目
  • Flink框架:批处理和流式处理与有界数据和无界数据之间的关系
  • 数据库视图讲解(view)
  • 8.3.1 MenuStrip(菜单)控件
  • 基于window11安装NACOS2.5.1的简介
  • Spark Core
  • 【Axure元件分享】移动端滑动拨盘地区级联选择器
  • 【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
  • 在Windows上安装Ubuntu24.04虚拟机
  • 全局端对端问题及应对方案
  • STM32F103VET6 芯片的主Flash 内存空间大小计算
  • 虚幻5的C++调试踩坑
  • 危险化学品标志速查手册(27个完整版)
  • 文件备份程序中的线程池管理:为何限制子线程数量?
  • Linux Makefile-概述、语句格式、编写规则、多文件编程、Makefile变量分类:自定义变量、预定义变量
  • 广东省深圳市公司/网站优化方案范文
  • 网站建设什么公司好/百度一下官方入口
  • 如何做网站的关键词排名/百度推广每年600元什么费用
  • 天河低价网站建设/友情链接什么意思
  • 网站权重最高是多少/网站建设开发简介
  • 人和做网站/无经验能做sem专员