使用R爬取网页下载Zip文件遇rawToChar错误,求代码修正
代码修正方案
错误原因分析
- 变量名错误:原代码中用
links = links[c(5:134)],但实际存储链接的变量是links1,导致引用未定义对象。 - 相对链接未补全域名:网页内的链接是相对路径,直接调用
read_html(link)无法正确访问页面,需要补全域名前缀。 - 下载URL拼接错误:
paste0(zip_page, zip[1])中zip_page是HTML对象,不是字符串,无法拼接成有效下载链接。 - 未指定保存文件夹:原代码直接用
zip[1]作为保存路径,无法定向存储到指定文件夹。 - 编码兼容问题:波斯语网页存在编码冲突,需显式指定编码格式。
修正后的代码
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
相关产品推荐
相关产品推荐

