使用R实现网页抓取,获取2020年2-3月每日price report
用R批量抓取FCA每日价格报告并保存为独立Excel工作表
所需R包
首先安装并加载必要的工具包:
install.packages(c("httr", "rvest", "openxlsx", "lubridate")) library(httr) library(rvest) library(openxlsx) library(lubridate)
步骤说明与代码实现
- 生成目标日期序列
生成2020年2月1日至3月31日的所有日期,并转换成网站表单要求的格式(示例为dd/mm/yyyy,需匹配网站实际格式):
# 生成日期序列 date_range <- seq(ymd("2020-02-01"), ymd("2020-03-31"), by = "day") # 格式化为网站兼容的字符串 formatted_dates <- format(date_range, "%d/%m/%Y")
- 模拟表单请求抓取数据
通过浏览器开发者工具(F12)分析网站提交日期时的表单参数,构造POST请求获取对应日期的报告数据:
# 初始化Excel工作簿 wb <- createWorkbook() # 循环处理每个日期 for (i in seq_along(formatted_dates)) { current_date <- formatted_dates[i] current_ymd <- date_range[i] # 构造POST请求参数(需根据网站实际表单参数调整) post_params <- list( txtDate = current_date, ddlReportType = "Daily Price Report", # 确认报告类型的参数值 btnGetData = "Get Data" # 提交按钮的参数名 ) # 发送POST请求 response <- POST( url = "https://fcainfoweb.nic.in/reports/report_menu_web.aspx", body = post_params, encode = "form" ) # 检查请求是否成功 if (http_status(response)$category != "Success") { message(paste("请求", current_date, "失败,跳过")) next } # 解析页面中的表格数据 page_html <- read_html(response) price_table <- page_html %>% html_table(fill = TRUE) # 检查是否抓取到有效表格 if (length(price_table) == 0) { message(paste(current_date, "无有效报告数据,跳过")) next } # 提取目标表格(根据页面结构调整索引) df <- price_table[[1]] # 创建工作表并写入数据,工作表名称用日期简写 sheet_name <- format(current_ymd, "%Y-%m-%d") addWorksheet(wb, sheetName = sheet_name) writeData(wb, sheet = sheet_name, x = df) message(paste("已成功保存", current_date, "的报告数据")) } # 保存最终Excel文件 saveWorkbook(wb, file = "FCA_2020_Feb_Mar_Price_Reports.xlsx", overwrite = TRUE)
关键注意事项
- 表单参数验证:必须通过浏览器开发者工具确认网站表单的实际参数名与值,比如
ddlReportType的选项值、提交按钮的参数名,上述代码中的参数为示例,需根据实际情况调整。 - 异常处理:代码包含请求失败、无数据的跳过逻辑,可根据需求添加重试机制。
- 表格解析调整:若页面存在多个表格,需修改
price_table[[n]]的索引,确保提取到正确的价格报告表格。
内容的提问来源于stack exchange,提问作者Debika Ghosh
相关产品推荐
相关产品推荐

