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

使用R爬取网页下载Zip文件遇rawToChar错误,求代码修正

代码修正方案

错误原因分析

  1. 变量名错误:原代码中用links = links[c(5:134)],但实际存储链接的变量是links1,导致引用未定义对象。
  2. 相对链接未补全域名:网页内的链接是相对路径,直接调用read_html(link)无法正确访问页面,需要补全域名前缀。
  3. 下载URL拼接错误:paste0(zip_page, zip[1])中zip_page是HTML对象,不是字符串,无法拼接成有效下载链接。
  4. 未指定保存文件夹:原代码直接用zip[1]作为保存路径,无法定向存储到指定文件夹。
  5. 编码兼容问题:波斯语网页存在编码冲突,需显式指定编码格式。

修正后的代码

library(tidyverse)
library(rvest)

# 1. 创建指定保存文件夹(不存在则自动生成)
save_dir <- "downloaded_zips"
if (!dir.exists(save_dir)) {
  dir.create(save_dir)
}

# 2. 读取目标页面,显式指定编码
base_url <- "http://konkur.in"
target_page_url <- paste0(base_url, "/5850/%d8%af%d8%a7%d9%86%d9%84%d9%88%d8%af-%d8%b1%d8%a7%db%8c%da%af%d8%a7%d9%86-%d8%b3%d9%88%d8%a7%d9%84%d8%a7%d8%aa-%d9%88-%d9%be%d8%a7%d8%b3%d8%ae-%d8%a7%d8%b1%d8%b4%d8%af-92.html")
page <- read_html(target_page_url, encoding = "UTF-8")

# 3. 提取并处理链接,修正变量名错误
links1 <- page %>% html_nodes(".text-single a") %>% html_attr("href")
# 筛选第5到134个链接,过滤空值并补全域名
links <- links1[5:134] %>% 
  discard(is.na) %>%
  map_chr(~ ifelse(str_starts(.x, "/"), paste0(base_url, .x), .x))

# 4. 定义下载函数,加入错误处理
download_zip <- function(link) {
  tryCatch({
    # 读取子页面,指定编码
    zip_page <- read_html(link, encoding = "UTF-8")
    # 提取zip下载链接
    zip_link <- zip_page %>% 
      html_nodes(".cont-donwload a") %>% 
      html_attr("href") %>% 
      first()
    
    if (!is.na(zip_link)) {
      # 补全zip链接的域名
      full_zip_url <- ifelse(str_starts(zip_link, "/"), paste0(base_url, zip_link), zip_link)
      # 提取原文件名
      zip_filename <- basename(full_zip_url)
      # 拼接指定文件夹的保存路径
      save_path <- file.path(save_dir, zip_filename)
      
      # 以二进制模式下载,避免文件损坏
      download.file(full_zip_url, destfile = save_path, mode = "wb", quiet = FALSE)
      message("已完成下载: ", zip_filename)
      return(save_path)
    } else {
      message("未找到有效zip链接: ", link)
      return(NA)
    }
  }, error = function(e) {
    message("处理链接出错: ", link, "\n错误信息: ", e$message)
    return(NA)
  })
  Sys.sleep(1) # 控制请求频率,避免触发反爬
}

# 5. 批量执行下载
zip_files <- map(links, download_zip)

关键修改点说明

  • 文件夹管理:提前创建指定存储文件夹,确保文件有合法存储路径。
  • 链接补全:所有相对路径自动拼接域名前缀,保证访问地址有效。
  • 编码适配:read_html显式设置encoding = "UTF-8",解决波斯语网页的编码乱码问题。
  • 错误捕获:用tryCatch包裹下载逻辑,单个链接出错不会中断整个批量任务。
  • 二进制下载:设置mode = "wb"确保zip二进制文件完整保存,避免损坏。
  • 变量修正:将links = links[c(5:134)]改为links = links1[5:134],修正变量引用错误。

内容的提问来源于stack exchange,提问作者mojdeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:20:47