Разбор графиков из серии веб-страниц - PullRequest
0 голосов
/ 13 января 2020

Возможно, что-то есть по этому вопросу, но я пока не нашел.

Я проанализировал список веб-страниц и извлекаю нужные списки из https://tradingeconomics.com/ Веб-сайт.

На любой странице отображается список стран с гиперссылкой для любой страны, в которой есть информация об этой конкретной стране.

Теперь на любой из этих страниц есть диаграмма, которую я хотел бы извлечь и сохранить в формате .pdf или .do c (или в любом другом доступном формате).

Вот мой код.

trading_ec <- read_html("https://tradingeconomics.com/indicators")

## 01. Formatting the link
tr_ec_tabs_39 <- tr_ec_tabs[39]
tr_ec_tabs_lo_39 <- tolower(tr_ec_tabs_39)
tr_ec_nospace_39 <- gsub(" ", "-", tr_ec_tabs_lo_39)

## 02. Choosing dataset (in the ex. : dataset 39, ' food inflation')
json.indicators_39 <- json.indicators[39]

## 03. Scraping the variables names
table_39 <- list()
for(i in seq_along(json.indicators_39))
{
table_39[[1]] <- html_table(read_html(json.indicators_39[1]))[[1]]
}

## 04. Turning the list into a dataframe 
table_39_df <- as.data.frame(table_39)

## 05. Building up the links
table_39_df$Country <- tolower(table_39_df$Country)
table_39_df$Country <- gsub(" ", "-", table_39_df$Country)
json.indicators_39_p <- paste0("https://tradingeconomics.com/" , table_39_df$Country, "/food-inflation")



## 06. Function to choose the tables one is interested in each page
table_39_tables <- list()
for(i in seq_along(json.indicators_39_p))
{
table_39_tables[[i]] <- html_table(read_html(json.indicators_39_p[i]), fill=TRUE)[[1]]
cat("Page", i, "of", length(json.indicators_39_p), "obtained.\n")
}

Есть подсказка?

1 Ответ

2 голосов
/ 13 января 2020

Вы можете легко получить каждый график как изображение в формате PNG. Я покажу вам шаги, которые вы можете использовать.

Сначала загрузите необходимые библиотеки, а затем получите вектор, содержащий все индикаторы, которые мы могли бы увидеть, используя xpath и html_attr для очистки ссылок со страницы. :

library(rvest)
library(tidyverse)

site       <- "https://tradingeconomics.com"
trading_ec <- read_html(paste0(site, "/indicators"))
link_xpath <- "//ul/li/a[contains(@id, 'ctl00_ContentPlaceHolder1')]"
link_nodes <- html_nodes(trading_ec, xpath = link_xpath)
link_names <- grep("country-list", html_attr(link_nodes, "href"), value = T)
indicators <- unlist(lapply(strsplit(link_names, "/"), function(x) x[3]))

Теперь их можно просматривать и сохранять и т. Д. c.

print(head(indicators))
# [1] "employed-persons"       "employment-change"      "employment-rate"       
# [4] "full-time-employment"   "initial-jobless-claims" "job-vacancies"

Далее мы можем определить функцию, которая даст нам список всех стран, доступных для изучения. для любого данного индикатора

list_countries <- function(indicator)
{
  url <- paste0("https://tradingeconomics.com/country-list/", indicator)
  indicator_page <- read_html(url)
  country_nodes <- html_nodes(indicator_page, xpath = "//td/a")
  relative_links <- html_attr(country_nodes, "href")
  countries <- unlist(lapply(strsplit(relative_links, "/"), function(x) x[2]))
  tibble(country = countries, 
         link = paste0("https://tradingeconomics.com", relative_links))
}

Это позволяет нам видеть все доступные страны для любого индикатора и ссылку на страницу этой страны.

link_df <- list_countries("food-inflation")
print(link_df)
#> # A tibble: 171 x 2
#>    country     link                                                   
#>    <chr>       <chr>                                                  
#>  1 afghanistan https://tradingeconomics.com/afghanistan/food-inflation
#>  2 albania     https://tradingeconomics.com/albania/food-inflation    
#>  3 algeria     https://tradingeconomics.com/algeria/food-inflation    
#>  4 argentina   https://tradingeconomics.com/argentina/food-inflation  
#>  5 armenia     https://tradingeconomics.com/armenia/food-inflation    
#>  6 aruba       https://tradingeconomics.com/aruba/food-inflation      
#>  7 australia   https://tradingeconomics.com/australia/food-inflation  
#>  8 austria     https://tradingeconomics.com/austria/food-inflation    
#>  9 azerbaijan  https://tradingeconomics.com/azerbaijan/food-inflation 
#> 10 bahrain     https://tradingeconomics.com/bahrain/food-inflation    
#> # ... with 161 more rows

Наконец, мы определяем функцию для упростить получение диаграммы с нашей целевой страницы. Мы сохраним это непосредственно на локальный диск, передав в файл нужное имя файла:

get_chart <- function(url, save_to)
{
  page <- read_html(url)
  image_node <- html_nodes(page, xpath = "//img[@id='ImageChart']")
  image_url <- html_attr(image_node, "src")
  download.file(image_url, destfile = save_to, mode = "wb")
}

Теперь мы можем сохранить изображение непосредственно на локальный диск. Это может быть добавлено в PDF или html при необходимости.

get_chart(as.character(link_df[1, 2]), path.expand("~/food_chart.png"))

В моем домашнем каталоге R у меня теперь есть следующий файл, сохраненный как food_chart.png : food_chart.png

Конечно, вы можете связать функции вместе, так что вам нужно только указать страну и индикатор и т. Д. c.

...