朋友让我用R语言的rvest库写一个通用的视频爬虫代码示例。首先,我需要回忆一下rvest库的主要功能,它主要是用来做网页抓取和解析的,类似于Python的BeautifulSoup。但是视频爬虫的话,可能需要处理动态加载的内容,或者找到视频的直链地址,这可能有点挑战性,但是总体来说还是需要点水平的。
以下是一个使用 R 语言 rvest
库编写的通用视频爬虫代码示例,包含详细注释和注意事项:
# 加载必要库
library(rvest) # 网页抓取
library(httr) # 处理HTTP请求
library(tools) # 处理文件扩展名# 设置通用视频爬虫函数
video_crawler <- function(url, # 目标页面URLvideo_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 # 更长的延迟更安全
# )
重要说明:
- 选择器选择:
- 视频链接可能位于不同位置,常见位置:
<video>
标签的src
属性<source>
标签的src
属性- JavaScript 动态加载数据(需要配合RSelenium)
- 使用浏览器开发者工具检查元素
- 动态内容处理:
# 如需处理JavaScript动态加载内容,建议配合RSelenium:
library(RSelenium)
remDr <- remoteDriver(browserName = "chrome")
remDr$open()
remDr$navigate(url)
page <- remDr$getPageSource()[[1]] %>% read_html()
- 反爬虫策略:
- 适当增加
delay
参数 - 使用代理服务器:
response <- GET(url, use_proxy("http://proxy.com:8080"))
- 法律声明:
- 使用前务必检查目标网站的
robots.txt
- 遵守网站的服务条款和相关法律法规
- 尊重版权和隐私保护
- 扩展功能建议:
- 添加自动识别文件扩展名功能
- 支持断点续传
- 添加下载进度条
- 支持代理池和User-Agent轮换
注意:实际使用时需要根据目标网站的具体结构调整选择器和其他参数,某些网站可能需要解析JavaScript或处理视频流分段(m3u8)等复杂情况。