多页面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是最便捷的方式:
- 创建一个
.Rmd文件 - 在代码块中运行上面的爬取代码得到
tradec_df - 循环生成每个国家的标题和图表:
--- 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
相关产品推荐
相关产品推荐

