You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:55:31