R语言批量爬取CGSpace多页面文档链接与标题的问题求助
R批量爬取CGSpace木薯文档(1-342页)并生成DataFrame
问题分析
你遇到的「replacement has length zero」错误,大概率是某一页抓取时未获取到标题/链接(比如页面加载失败、目标元素不存在),导致赋值操作时长度不匹配。用单个循环可以更灵活地处理异常,避免程序中断。
解决方案代码
# 加载所需包 library(rvest) library(dplyr) # 初始化空的结果DataFrame result_df <- data.frame(title = character(), link = character(), stringsAsFactors = FALSE) # 定义基础URL(替换成你实际的CGSpace木薯搜索页URL,确保末尾是页码参数) base_url <- "https://your-cgspace-url/cassava?page=" # 循环遍历1到342页 for (page_num in 1:342) { # 构造当前页URL current_url <- paste0(base_url, page_num) # 尝试抓取页面,捕获异常避免程序中断 tryCatch({ # 读取页面内容 page <- read_html(current_url) # 抓取文档标题(替换成你之前验证过的正确选择器) titles <- page %>% html_elements("h3.document-title a") %>% # 示例选择器,根据实际页面调整 html_text2() # 抓取文档链接(注意拼接完整URL,避免相对路径) links <- page %>% html_elements("h3.document-title a") %>% html_attr("href") %>% paste0("https://your-cgspace-url", .) # 替换成CGSpace域名,拼接完整链接 # 如果当前页有数据,追加到结果DataFrame if (length(titles) > 0 && length(links) > 0) { temp_df <- data.frame(title = titles, link = links, stringsAsFactors = FALSE) result_df <- bind_rows(result_df, temp_df) } # 打印当前进度,方便跟踪 cat("已完成第", page_num, "页抓取,累计", nrow(result_df), "条数据\n") # 延迟1秒,避免请求过于频繁被服务器拦截 Sys.sleep(1) }, error = function(e) { # 打印错误信息,继续下一页 cat("第", page_num, "页抓取失败:", e$message, "\n") }) } # 查看最终结果 head(result_df)
关键注意事项
- 选择器验证:确保
html_elements里的选择器和你单页爬取时的一致,比如如果标题是在div.title a里,就替换成对应的选择器。 - 完整链接拼接:如果抓取到的是相对路径(比如
/handle/123/456),必须拼接CGSpace的域名,否则链接无效。 - 异常处理:
tryCatch能捕获页面加载失败、选择器失效等错误,保证循环不会中途终止。 - 请求延迟:
Sys.sleep(1)可以降低服务器压力,避免被反爬机制拦截,也可以根据情况调整延迟时间。
内容的提问来源于stack exchange,提问作者Miguel Angel Acosta Chinchilla
相关产品推荐
相关产品推荐

