【问题标题】:R web scraping charts on multiple pagesR web在多个页面上抓取图表
【发布时间】:2021-02-19 14:24:45
【问题描述】:

也许这个主题在其他帖子中得到了处理,但我找不到我的问题的解决方案。 我正在尝试从https://tradingeconomics.com/indicators 网站上抓取数据。我正在尝试抓取有关指标的数据,特别是国家名称和任何国家链接中包含的地块。

tradec = function(tradelink) {
trade_page = read_html(tradelink)
trade_element = trade_page %>% html_nodes(".primary_photo+ td a") %>%
html_text() %>% paste(collapse = ",")
return(trade_element)
}

main_page <- read_html("https://tradingeconomics.com/country-list/gdp-growth-rate")
country_list <-  main_page %>% 
html_nodes("#ctl00_ContentPlaceHolder1_ctl01_UpdatePanel1 a") %>% 
html_text() %>% 
trimws %>% 
gsub(" ", "-", .)


tradec_df = data.frame()

for (i in country_list) {
link = paste0("https://tradingeconomics.com/", i , "/gdp-growth")
page = read_html(link)

country = page %>% html_nodes("#SelectCountries") %>% html_text()
tradec_charts = page %>% html_nodes("#ImageChart") %>% html_text

tradec_df = rbind(tradec_df, data.frame(country, tradec_charts, stringsAsFactors = FALSE))
print(paste("Page:", country_list)) 

} 

在理想的世界中,我希望为每个国家打印一个页面,包括国家名称和情节。我很确定地块可能会以某种方式被刮掉并显示,尽管我不知道如何。 有什么建议吗?

【问题讨论】:

    标签: r web-scraping gplots


    【解决方案1】:

    它不起作用,因为countries 变量中的每个元素都包含非法字符:

     [1] "\r\n                                        South Africa\r\n                                    "          
     [2] "\r\n                                        Peru\r\n                                    "                  
     [3] "\r\n                                        Botswana\r\n                                    "   
    

    所以你需要做的就是删除那些带有trimws()的字符,所以它们看起来像这样:

    country_list
     [1] "South Africa"           "Peru"                   "Botswana"               "India"                  "Turkey"                
     [6] "New Zealand"            "Argentina"              "Malta"                  "Slovenia"               "El Salvador"           
    [11] "Ireland"                "Rwanda"                 "Albania"                "Luxembourg"             "Nigeria"               
    [16] "Canada"                 "Jamaica"                "Uruguay"                "Brazil"                 "Paraguay"  
    

    这行得通。我更改的唯一行是将管道添加到trimws()

    library(tidyverse)
    library(rvest)
    
    
    tradec = function(tradelink) {
    trade_page = read_html(tradelink)
    trade_element = trade_page %>% html_nodes(".primary_photo+ td a") %>%
    html_text() %>% paste(collapse = ",")
    return(trade_element)
    }
    
    main_page <- read_html("https://tradingeconomics.com/country-list/gdp-growth-rate")
    country_list <-  main_page %>% 
      html_nodes("#ctl00_ContentPlaceHolder1_ctl01_UpdatePanel1 a") %>% 
      html_text() %>% 
      trimws
    
    
    tradec_df = data.frame()
    
    for (i in country_list) {
      link = paste0("https://tradingeconomics.com/", i , "/gdp-growth")
      page = read_html(link)
      
      country = page %>% html_nodes("#SelectCountries") %>% html_text()
      tradec_links = page %>% html_nodes("#ImageChart") %>% html_text
    }
    

    【讨论】:

    • 感谢您的回复和建议。不过,我收到此错误消息:open.connection(x, "rb") 中的错误:HTTP 错误 400。无论如何,以这种方式下载图表的格式是什么?
    • @IlForna 400 错误意味着找不到页面。因此,接下来您必须解决的问题是确保您使用代码生成的 URL 与网站使用的 URL 完全相同。
    • @IlForna 我检查了,您列表中的国家/地区以空格分隔,但在 URL 中,它们以破折号分隔。所以你需要在trimws %&gt;% gsub(" ", "-", .) 之后添加它。这将用破折号替换所有空格,然后刮擦工作。
    • @IlForna 将解决您在此问题中概述的问题。我无法确切地知道你在循环中在做什么,但是如果你考虑一下你在那里做什么,你可以在另一个问题中问它
    • 非常感谢您的帮助!我确实没有注意到破折号。我已经根据您的建议和我的需要编辑了代码,并且我也编辑了问题。这是我在 R 中从未遇到过的领域,因此我的动作很尴尬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2016-08-09
    • 2022-01-21
    • 2021-09-30
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多