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

多页面R语言网页爬取:TradingEconomics网站国家指标图表爬取问题求助

解决Trading Economics国家图表爬取的问题

我看了你的代码,发现几个关键问题导致你没法正确获取图表,咱们一步步来修正:

现有代码的核心问题

  • 图表获取方式错误:你用html_text()获取#ImageChart的内容,但这是一个<img>标签,真正的图片链接在src属性里,得用html_attr("src")来提取。
  • 国家列表生成不够可靠:手动把空格替换成-容易出错(比如有些国家名称有特殊字符或缩写),直接从页面的a标签提取href属性才是最稳妥的方式。
  • 循环效率低且print错误:循环里用rbind拼接数据框很慢,而且print(paste("Page:", country_list))会打印整个国家列表,应该打印当前处理的国家。
  • 缺少错误处理:部分国家页面可能加载失败或者没有图表,不加处理会导致代码中途崩溃。

修正后的完整代码

library(rvest)
library(dplyr)

# 初始化存储结果的列表
results_list <- list()

# 爬取主页面,直接提取国家链接和名称
main_page <- read_html("https://tradingeconomics.com/country-list/gdp-growth-rate")
country_links <- main_page %>% 
  html_nodes("#ctl00_ContentPlaceHolder1_ctl01_UpdatePanel1 a") %>%
  tibble(
    country_name = html_text(.) %>% trimws(),
    href = html_attr(., "href")
  )

# 循环处理每个国家
for (i in seq(nrow(country_links))) {
  current_country <- country_links$country_name[i]
  current_href <- country_links$href[i]
  full_link <- paste0("https://tradingeconomics.com", current_href)
  
  # 加入错误捕获,避免单个页面失败导致整个程序中断
  tryCatch({
    page <- read_html(full_link)
    
    # 获取图表链接:提取img标签的src属性
    chart_src <- page %>% 
      html_nodes("#ImageChart") %>% 
      html_attr("src") %>%
      # 补全相对链接(如果有的话)
      ifelse(startsWith(., "/"), paste0("https://tradingeconomics.com", .), .)
    
    # 将结果存入列表
    results_list[[i]] <- tibble(
      country = current_country,
      chart_url = chart_src
    )
    
    print(paste("已完成:", current_country))
  }, error = function(e) {
    print(paste("处理", current_country, "时出错:", e$message))
    results_list[[i]] <- tibble(
      country = current_country,
      chart_url = NA_character_
    )
  })
  # 加入延迟,避免触发反爬机制
  Sys.sleep(1)
}

# 将列表合并为数据框
tradec_df <- bind_rows(results_list)

如何生成包含图表的页面

如果你想生成展示所有国家名称和对应图表的页面,用R Markdown是最便捷的方式:

  1. 创建一个.Rmd文件
  2. 在代码块中运行上面的爬取代码得到tradec_df
  3. 循环生成每个国家的标题和图表:
---
title: "各国GDP增长率图表"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
# 这里运行上面的爬取代码,得到tradec_df

各国GDP增长率图表

for (i in seq(nrow(tradec_df))) {
  cat(paste0("### ", tradec_df$country[i], "\n"))
  if (!is.na(tradec_df$chart_url[i])) {
    knitr::include_graphics(tradec_df$chart_url[i])
  } else {
    cat("无可用图表\n")
  }
  cat("\n---\n\n")
}
渲染这个R Markdown文件后,就能得到一个包含所有国家名称和对应图表的HTML页面了。

另外要注意:网站存在反爬机制,频繁请求可能会被限制访问,所以代码里加入了`Sys.sleep(1)`来控制请求频率,如果你需要爬更多数据,可以适当延长延迟时间。

内容的提问来源于stack exchange,提问作者Il Forna
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:47:46