使用Rvest循环批量抓取意大利企业资产负债表数据求助
批量抓取意大利企业资产负债表数据实现方案
需求说明
需抓取指定网站“Italia”标签下所有企业2017-2021年的资产负债表数据,已完成单企业抓取逻辑,需扩展为批量处理,最终输出:
- 各企业单独的数据集文件
- 合并后的总数据集
实现步骤
1. 获取所有意大利企业的链接列表
首先从目标页面爬取所有企业的详情页完整URL:
library(rvest) library(dplyr) library(purrr) # Italia标签页主URL main_url <- "https://www.evaluation.it/aziende/bilanci-aziende" main_page <- read_html(main_url) # 提取所有企业详情页链接(需确认页面元素选择器准确性,可通过浏览器开发者工具调整) company_links <- main_page %>% html_nodes(".azienda a") %>% html_attr("href") %>% paste0("https://www.evaluation.it", .)
2. 封装单企业抓取函数
将原单企业抓取逻辑封装为可复用函数,简化年份批量提取逻辑:
scrape_company_balance <- function(link) { page <- read_html(link) # 获取企业名称并清理空格 azienda <- page %>% html_nodes(".big_text1:nth-child(1) i") %>% html_text() %>% trimws() # 获取资产负债表项目名称 voce <- page %>% html_nodes(".text-left") %>% html_text() %>% trimws() # 批量提取2017-2021年数据 years <- 2017:2021 bil_data <- map_dfc(seq_along(years), function(i) { col_index <- i + 1 # 对应页面中第2至第6列 year_data <- page %>% html_nodes(paste0(".text-right :nth-child(", col_index, ")")) %>% html_text() %>% trimws() # 移除对应位置的无效行(原单企业代码中[-2]等逻辑,需确认是否统一适用) year_data <- year_data[-(col_index)] # 为列命名 set_names(tibble(year_data), paste0("bil_", years[i])) }) # 合并数据并添加企业名称 bilancio <- bind_cols(tibble(voce), bil_data) %>% mutate(azienda = azienda) return(bilancio) }
3. 批量抓取所有企业数据
使用map批量处理链接,添加请求间隔避免被网站封禁:
# 批量抓取,捕获错误避免程序中断 all_companies_data <- map(company_links, function(link) { tryCatch({ Sys.sleep(1) # 每个请求间隔1秒 scrape_company_balance(link) }, error = function(e) { message(paste("抓取失败:", link, "错误信息:", e$message)) return(NULL) }) }) # 过滤掉抓取失败的空数据 all_companies_data <- compact(all_companies_data)
4. 保存单独数据集与合并总数据集
# 创建单独数据集保存文件夹 dir.create("company_balance_sheets", showWarnings = FALSE) # 保存每个企业的单独CSV文件 walk(all_companies_data, function(df) { # 清理企业名称中的特殊字符,避免文件名异常 clean_name <- df$azienda[1] %>% gsub("[^a-zA-Z0-9]", "_", .) write.csv(df, paste0("company_balance_sheets/", clean_name, ".csv"), row.names = FALSE) }) # 合并所有企业数据为总数据集并保存 total_balance_data <- bind_rows(all_companies_data) write.csv(total_balance_data, "total_italy_company_balance_2017-2021.csv", row.names = FALSE)
注意事项
- 需遵守网站
robots.txt规则,可适当延长请求间隔降低封禁风险 - 若页面结构变更,需同步调整HTML节点选择器
- 部分企业可能存在数据缺失,需根据实际情况优化异常处理逻辑
内容的提问来源于stack exchange,提问作者Andrea Stringhetti
相关产品推荐
相关产品推荐

