基于日期循环遍历URL并存储数据至数据框报错求助
解决遍历日期抓取哈萨克斯坦国家银行数据的问题
首先看你给出的代码片段,最明显的问题是paste0语句没有完成日期的拼接,而且缺少网页解析和数据存储的关键步骤。我来帮你完善整个流程,确保能正确遍历日期并把数据存入数据框:
1. 先加载必要的包
首先需要安装并加载用于网页抓取和数据处理的包:
# 安装需要的包(如果没安装过) install.packages(c("rvest", "dplyr", "lubridate")) # 加载包 library(rvest) library(dplyr) library(lubridate)
2. 修正日期遍历和URL拼接
你的日期序列生成是对的,但URL拼接需要把date变量转换成YYYY-MM-DD格式插入到链接里,注意原URL里的&其实是HTML转义的&,直接用&就行:
StartDate <- "2015-01-01" EndDate <- "2017-07-10" dates <- seq(as.Date(StartDate, format="%Y-%m-%d"), as.Date(EndDate, format="%Y-%m-%d"), by='days') # 初始化空列表存储数据 ML <- list()
3. 完善循环内的抓取逻辑
循环里需要处理每个日期的URL,抓取网页数据,还要加错误处理避免某个日期出错导致整个循环中断:
for (i in seq_along(dates)) { current_date <- dates[i] # 拼接正确的URL,把日期转成字符串格式 url <- paste0("http://nationalbank.kz/?docid=105&cmomdate=", format(current_date, "%Y-%m-%d"), "&switch=english") # 尝试抓取网页,加错误处理 tryCatch({ # 读取网页 page <- read_html(url) # 这里需要根据网页实际结构提取数据,假设数据在表格里 # 比如提取第一个表格的内容,你需要根据实际网页调整选择器 data_table <- page %>% html_element("table") %>% # 替换成实际的表格选择器,比如".data-table" html_table(header = TRUE) # 给数据添加日期列 data_table$date <- current_date # 存入列表 ML[[i]] <- data_table # 打印进度,方便跟踪 cat("Successfully fetched data for", current_date, "\n") }, error = function(e) { # 捕获错误,打印信息继续循环 cat("Failed to fetch data for", current_date, "Error:", e$message, "\n") ML[[i]] <- NULL # 出错的位置存入空值,后续可以过滤掉 }) # 加个延迟,避免请求太频繁被网站封禁 Sys.sleep(1) }
4. 把列表转换成数据框
循环结束后,把列表里的有效数据合并成一个数据框:
# 过滤掉空值,合并所有数据 final_df <- bind_rows(ML) # 查看结果 head(final_df)
关键注意事项
- 网页选择器调整:上面的
html_element("table")是通用写法,你需要打开目标网页,用浏览器的开发者工具(F12)查看实际的表格CSS选择器或XPath,替换成正确的选择器才能准确提取数据。 - 反爬机制:添加
Sys.sleep(1)是为了避免短时间内发送大量请求被网站封禁,如果还是被限制,可以适当延长延迟时间。 - 日期有效性:有些日期可能是节假日,网站没有数据,
tryCatch会捕获这些错误,保证循环继续运行。
内容的提问来源于stack exchange,提问作者AK88
相关产品推荐
相关产品推荐

