Raspando a página do Studio Ghibli, na Wikipédia

Web Scraping
Tutorial
Autoria

Ornella Scardua Ferreira

Data de Publicação

31 de outubro de 2023

Autoria

Foto

Este post foi escrito por Ornella Scardua Ferreira: .

“Amo gráficos como amo cavalos. Gosto de música ruim e de cinema (bom). Sou apaixonada pelo Botafogo e pelo Bayern de Munique. Prefiro Vila Velha a qualquer lugar no mundo. Não tenho sonhos, mas um dia espero ver a Palestina livre.”

Fundado em 1985 pelos cineastas japoneses Hayao Miyazaki, Isao Takahata, Toshio Suzuki e Yasuyoshi Tokuma, o Studio Ghibli é um dos estúdios de animação japonesa mais famosos ao redor do mundo.

Além de serem reconhecidos pelos traços e cores muito singulares de seus personagens e cenários, os filmes, curtas e comercias do Studio Ghibli são muito aclamados pela crítica e pelo público devido, principalmente, à sensibilidade dos temas que cerceiam suas histórias e a maneira como elas são contadas para nós.

Imagem obtida no site Plano Crítico

Imagem obtida no site Plano Crítico

Por isso tudo, que tal “scrapear” (ou raspar) a página do Studio Ghibli, na Wikipédia a maior enciclopédia colaborativa web do mundo, e coletar os dados de todos os filmes já lançados por esse estúdio de cinema? Scrapers e Ghibli-fãs, uni-vos!

Figura 1: Imagem da página do Studio Ghibli, no Wikipédia.

Para quem não conhece os filmes, muitos estão disponíveis na Netflix!

Página da Netflix com filmes do Studio Ghibli

Página da Netflix com filmes do Studio Ghibli

Etapas do scraping

Nesta seção, vamos apresentar cada uma das etapas necessárias para raspar os dados sobre os filmes do Studio Ghibli, no site da Wikipédia. Os processos vão envolver imitar a requisição de busca do navegador e “parsear” os arquivos obtidos, iterando-os com elementos para o tratamento dos erros e de barras de progresso. É importante mencionar, ainda, que a Wikipédia é um site estático escrito em HTML.

Para tanto, vamos utilizar os pacotes R httr para acessar a web; xml2 e rvest para extrair dados de arquivos HTML; purrr para iterar e identificar erros; progressr para incluir barras de progresso; o queridinho tidyverse para a manipulação e visualização dos dados extraídos; e, já que estamos falando de Studio Ghibli, ghibli para colorir nossos gráficos como um filme criado pelo próprio Miyazaki e cia.

library(httr)
library(xml2)
library(rvest)
library(progressr)
library(tidyverse) # o {purrr} faz parte do {tidyverse}
library(ghibli)

Mas não se preocupe porque ao longo da apresentação dos códigos vamos sempre corresponder às funções ao seus respectivos pacotes (por meio do ::) para você saber exatamente com o que está lidando.

Requisição

Inicialmente, inspecionamos a página do Studio Ghibli na Wikipédia para encontrar os elementos em HTML que estão associados exclusivamente às informações dos filmes (como título, ano de lançamento, duração, diretor, elenco etc). Felizmente, esses dados estão todos resumidos em uma única tabela dentre a única tabela que existe na página (na Seção Filmografia, para ser mais exata) - o que deixou a tarefa de raspagem muito mais fácil, por sinal.

Figura 2: Imagem da inspeção na página do Studio Ghibli, no Wikipédia.

Em primeiro lugar, vamos coletar somente os dados apresentados nessa tabela. Assim, simulamos a requisição apenas com a URL do site, sem deixar de salvar (com o nome filmes_ghibli.html) a página requerida no diretório output/. Como coletar essa tabela se trata de um scraping muito simples, já no próximo passo é possível ler o elemento HTML cujo parâmetro XPath é igual a //*[@id='mw-content-text']/div[1]/table[3], obtido conforme mostra a Figura 2.

O código para o processo da requisição e leitura da tabela em HTML pode ser visto a seguir. Obs.: usamos a função xml_find_first() pois, nesse caso, existia uma única tabela.

# URL da página do Wikipédia

u_ghibli <- "https://pt.wikipedia.org/wiki/Studio_Ghibli"

# requisicao GET

r_ghibli <- httr::GET(
  u_ghibli, 
  httr::write_disk("output/filmes_ghibli.html", overwrite = TRUE) # salvar pagina no disco
)

# coletando a tabela

tabela_ghibli <- r_ghibli |> 
  xml2::read_html() |>  # ler arquivo HTML
  xml2::xml_find_first("//*[@id='mw-content-text']/div[1]/table[3]") # parametro XPath

A tabela (ainda em HTML, lembrando) que acabamos de obter só contém as informações mais gerais dos filmes do Studio Ghibli. Mas… e se quisermos montar uma base de dados em que seja possível, por exemplo, analisar sobre a duração, gênero e elenco dos filmes? Bem, para esse fim, vamos continuar utilizando a tabela anterior, que, como podemos observar na Figura 2, está sob a tag <table> e o atributo class='wikitable unsortable'. Percebam, ainda, agora na Figura 3, que os títulos são links (identificados com a tag <a>) que direcionam para as páginas individuais de cada um dos filmes, locais onde estão as informações pelas quais estamos interessados.

Figura 3: Imagem da inspeção dos títulos na tabela da página do Studio Ghibli, no Wikipédia.

Para extrair esses links, precisamos encontrar todos os links disponíveis na tabela cuja classe é do tipo 'wikitable unsortable'. Logo, lemos a página HTML e coletamos todos os elementos (ou nós) que fazem parte das tags <a> e os atrbiutos do tipo href. Para tal tarefa, construímos o seguinte código:

links_filmes <- r_ghibli |> 
  xml2::read_html() |> # ler arquivo HTML
  xml2::xml_find_all("//table[@class='wikitable unsortable']//a") |> # coletar todos os nos da tabela dentro das tags <a>
  xml2::xml_attr("href") # coletar atributos href

links_filmes
 #>  [1] "/wiki/Tenk%C5%AB_no_Shiro_Rapyuta"        
 #>  [2] "/wiki/Hayao_Miyazaki"                     
 #>  [3] "/wiki/Isao_Takahata"                      
 #>  [4] "/wiki/Joe_Hisaishi"                       
 #>  [5] "/wiki/Hotaru_no_Haka"                     
 #>  [6] "/wiki/Isao_Takahata"                      
 #>  [7] "/wiki/Tonari_no_Totoro"                   
 #>  [8] "/wiki/Majo_no_Takky%C5%ABbin"             
 #>  [9] "/wiki/Omoide_Poro_Poro"                   
 #> [10] "/wiki/Kurenai_no_Buta"                    
 #> [11] "/wiki/Umi_ga_Kikoeru"                     
 #> [12] "/wiki/Heisei_Tanuki_Gassen_Ponpoko"       
 #> [13] "/wiki/Mimi_wo_Sumaseba"                   
 #> [14] "/wiki/Mononoke_Hime"                      
 #> [15] "/wiki/H%C5%8Dhokekyo_Tonari_no_Yamada-kun"
 #> [16] "/wiki/A_Viagem_de_Chihiro"                
 #> [17] "/wiki/O_Reino_dos_Gatos"                  
 #> [18] "/wiki/Hiroyuki_Morita"                    
 #> [19] "/wiki/Hauru_no_Ugoku_Shiro"               
 #> [20] "/wiki/Contos_de_Terramar"                 
 #> [21] "/wiki/Goro_Miyazaki"                      
 #> [22] "/wiki/Gake_no_ue_no_Ponyo"                
 #> [23] "/wiki/Kari-gurashi_no_Arietti"            
 #> [24] "/wiki/Hiromasa_Yonebayashi"               
 #> [25] "/wiki/Kokuriko-zaka_Kara"                 
 #> [26] "/wiki/Kaze_Tachinu"                       
 #> [27] "/wiki/O_Conto_da_Princesa_Kaguya"         
 #> [28] "/wiki/Yoshiaki_Nishimura"                 
 #> [29] "/wiki/Omoide_no_Marnie"                   
 #> [30] "/wiki/%C4%80ya_to_Majo"                   
 #> [31] "/wiki/Kimitachi_wa_Dou_Ikiru_ka"

No entanto, os 31 links gerados são da forma /wiki/nome_do_filme, ou seja, inválidos. Validamo-os com o próximo código:

links_filmes <- paste0("https://pt.wikipedia.org", links_filmes)

head(links_filmes)
 #> [1] "https://pt.wikipedia.org/wiki/Tenk%C5%AB_no_Shiro_Rapyuta"
 #> [2] "https://pt.wikipedia.org/wiki/Hayao_Miyazaki"             
 #> [3] "https://pt.wikipedia.org/wiki/Isao_Takahata"              
 #> [4] "https://pt.wikipedia.org/wiki/Joe_Hisaishi"               
 #> [5] "https://pt.wikipedia.org/wiki/Hotaru_no_Haka"             
 #> [6] "https://pt.wikipedia.org/wiki/Isao_Takahata"

Uma vez corrigidos, podemos fazer a requisição de todas as páginas dos filmes de uma só vez, iterando o processo de tal maneira que algum erro que aconteça em alguma requisição seja identificado.

A primeira função que vamos criar é a get_links(), cujo papel é simplesmente obter uma requisição da mesma forma que havíamos feito inicialmente.

get_links <- function(links, ids) {
  arquivo <- paste0("output/", ids, ".html")
  r <- httr::GET(links, write_disk(arquivo, overwrite = TRUE))
  
  arquivo
}

A segunda função que vamos constuir, a get_progresso(), vai obter as requisições por meio da função get_links() adicionada da informação de erro com o auxílio da função purrr::possibly(). Vejam que, caso aconteça algum problema durante a requisição feita pela get_links(), a seguinte mensagem de erro aparecerá: “ERRO NA REQUISIÇÃO”. A mensagem pode ser escrita de acordo com o gosto do leitor, vale frisar.

Bom, já ao utilizar a função progressr::with_progress(), incluímos uma barra de progresso à iteração. Dois comentários importantes a serem feitos: (1) a função purrr::possibly() permite o andamento da iteração mesmo se houver algum erro no meio do caminho, e se ocorrer algum erro, ela identifica exatamente em qual momento o erro aconteceu; e (2) a barra de progresso serve para o acompanhamento de cada passo da iteração (Figura 4).

# funcao para obter as requisicoes com erro

get_progresso <- function(links, ids, progresso) {
  # progresso
  progresso()
  # mapear erros nas requisicoes
  get_erro <- purrr::possibly(get_links, otherwise = "ERRO NA REQUISIÇÃO")
  get_erro(links, ids)
}

# obtendo as requisicoes com erro e barra de progresso

progressr::with_progress({
  # barra de progresso
  progresso <- progressr::progressor(length(links_filmes))
  purrr::map2(
    links_filmes, seq_along(links_filmes), 
    get_progresso, p = progresso
  )
})
 #> [[1]]
 #> [1] "output/1.html"
 #> 
 #> [[2]]
 #> [1] "output/2.html"
 #> 
 #> [[3]]
 #> [1] "output/3.html"
 #> 
 #> [[4]]
 #> [1] "output/4.html"
 #> 
 #> [[5]]
 #> [1] "output/5.html"
 #> 
 #> [[6]]
 #> [1] "output/6.html"
 #> 
 #> [[7]]
 #> [1] "output/7.html"
 #> 
 #> [[8]]
 #> [1] "output/8.html"
 #> 
 #> [[9]]
 #> [1] "output/9.html"
 #> 
 #> [[10]]
 #> [1] "output/10.html"
 #> 
 #> [[11]]
 #> [1] "output/11.html"
 #> 
 #> [[12]]
 #> [1] "output/12.html"
 #> 
 #> [[13]]
 #> [1] "output/13.html"
 #> 
 #> [[14]]
 #> [1] "output/14.html"
 #> 
 #> [[15]]
 #> [1] "output/15.html"
 #> 
 #> [[16]]
 #> [1] "output/16.html"
 #> 
 #> [[17]]
 #> [1] "output/17.html"
 #> 
 #> [[18]]
 #> [1] "output/18.html"
 #> 
 #> [[19]]
 #> [1] "output/19.html"
 #> 
 #> [[20]]
 #> [1] "output/20.html"
 #> 
 #> [[21]]
 #> [1] "output/21.html"
 #> 
 #> [[22]]
 #> [1] "output/22.html"
 #> 
 #> [[23]]
 #> [1] "output/23.html"
 #> 
 #> [[24]]
 #> [1] "output/24.html"
 #> 
 #> [[25]]
 #> [1] "output/25.html"
 #> 
 #> [[26]]
 #> [1] "output/26.html"
 #> 
 #> [[27]]
 #> [1] "output/27.html"
 #> 
 #> [[28]]
 #> [1] "output/28.html"
 #> 
 #> [[29]]
 #> [1] "output/29.html"
 #> 
 #> [[30]]
 #> [1] "output/30.html"
 #> 
 #> [[31]]
 #> [1] "output/31.html"

Nenhum “ERRO NA REQUISIÇÃO”, yes!

Ah, na Figura 4 é possível ter uma ideia de como é uma barra de progresso.

Figura 4: Barra de progresso na prática.

Parsing

Ao realizar raspagem de dados, a etapa de parsing nada mais é do que processar os dados brutos, que geralmente estão nos formatos .html ou .json, e posteriormente organizá-los de modo que consigamos realizar análises. Em nosso caso, coletamos dados .html tanto no cenário em que queríamos as informações expostas na tabelona da página do Studio Ghibli quanto no cenário em que buscamos as informações dos filmes em cada um dos links direcionáveis dispostos nessa mesma tabela. Em ambas as situações, transformamos os dados para um data frame (ou um tibble) ao fazer uma aplicação simples com a função rvest::html_table().

Notem que, no segundo cenário, optamos pelo arquivo 5.html. Ele se refere ao filme “O Túmulo de Vagalumes”, o filme do Studio Ghibli preferido desta que vos escreve - mas o processo de parsing para qualquer um dos 31 arquivos gerados é o mesmo, caso seu filme favorito seja outro. Nesse caso, quando aplicamos a função mágica rvest::html_table(), o R retorna uma lista com 8 elementos, pois lembre-se que foram coletados todos os nós das tags <a> e todos os atributos da forma href.

Figura 5: Box da página do Studio Ghibli, no Wikipédia, referente ao elemento [[1]].

Para esse post, vamos nos limitar ao primeiro elemento ([[1]]), que corresponde ao box à direita na página https://pt.wikipedia.org/wiki/Hotaru_no_Haka (Figura 5), o qual contém informações bastante interessantes para uma análise sucinta do filme.

# primeiro cenario

tabela_ghibli <- tabela_ghibli |>   
  rvest::html_table(header = TRUE) # transformar dados HTML em tibble

tabela_ghibli
 #> # A tibble: 23 × 6
 #>    Ano   Título                    Diretor `Roteirista(s)` `Produtor(es)` Música
 #>    <chr> <chr>                     <chr>   <chr>           <chr>          <chr> 
 #>  1 1986  Tenkū no Shiro Rapyuta    Hayao … Hayao Miyazaki  Isao Takahata  Joe H…
 #>  2 1988  Hotaru no Haka            Isao T… Isao Takahata   Toru Hara      Michi…
 #>  3 1988  Tonari no Totoro          Hayao … Hayao Miyazaki  Toru Hara      Joe H…
 #>  4 1989  Majo no Takkyūbin         Hayao … Hayao Miyazaki  Hayao Miyazaki Joe H…
 #>  5 1991  Omoide Poro Poro          Isao T… Isao Takahata   Toshio Suzuki  Katsu…
 #>  6 1992  Kurenai no Buta           Hayao … Hayao Miyazaki  Toshio Suzuki  Joe H…
 #>  7 1993  Umi ga Kikoeru            Tomomi… Keiko Niwa      Toshio Suzuki  Shige…
 #>  8 1994  Heisei Tanuki Gassen Pon… Isao T… Isao Takahata   Toshio Suzuki  Shang…
 #>  9 1995  Mimi wo Sumaseba          Yoshif… Hayao Miyazaki  Toshio Suzuki  Yuji …
 #> 10 1997  Mononoke Hime             Hayao … Hayao Miyazaki  Toshio Suzuki  Joe H…
 #> # ℹ 13 more rows
# segundo cenario

tumulo_vagalumes <- xml2::read_html("output/5.html") |>  
  rvest::html_table() # transformar dados HTML em tibble

tumulo_vagalumes
 #> [[1]]
 #> # A tibble: 19 × 2
 #>    `Hotaru no Haka`                                         `Hotaru no Haka`    
 #>    <chr>                                                    <chr>               
 #>  1 .mw-parser-output .noitalic{font-style:normal}火垂るの墓 ".mw-parser-output …
 #>  2 Hotaru no Haka                                           "Hotaru no Haka"    
 #>  3 No Brasil                                                "O Túmulo dos Vagal…
 #>  4 Em Portugal                                              "O Túmulo dos Piril…
 #>  5 Japão1988 •  cor •  89 min                               "Japão1988 •  cor •…
 #>  6 Gênero                                                   "drama[4]guerra[5]" 
 #>  7 Direção                                                  "Isao Takahata"     
 #>  8 Produção                                                 "Toru Hara"         
 #>  9 Roteiro                                                  "Isao Takahata"     
 #> 10 Baseado em                                               "\"Hotaru no Haka\"…
 #> 11 Elenco                                                   "Tsutomu TatsumiAya…
 #> 12 Música                                                   "Michio Mamiya"     
 #> 13 Cinematografia                                           "Nobuo Koyama"      
 #> 14 Edição                                                   "Takeshi Seyama"    
 #> 15 Companhia(s) produtora(s)                                "Studio Ghibli"     
 #> 16 Distribuição                                             "Toho"              
 #> 17 Lançamento                                               "16 de abril de 198…
 #> 18 Idioma                                                   "japonês"           
 #> 19 Receita                                                  "¥ 590 milhões[6]"  
 #> 
 #> [[2]]
 #> # A tibble: 20 × 4
 #>    X1             X2                                                 X3    X4   
 #>    <chr>          <chr>                                              <chr> <lgl>
 #>  1 N.º            "Título"                                           Dura… NA   
 #>  2 1.             "\"Setsuko to Seita ~ Main Title (節子と清太~メ…  2:57  NA   
 #>  3 2.             "\"Yake Nohara (焼野原, Yake Nohara?)\""           6:51  NA   
 #>  4 3.             "\"Haha no Shi (母の死, Haha no Shi?)\""           6:34  NA   
 #>  5 4.             "\"Shoka (初夏, Shoka?)\""                         3:14  NA   
 #>  6 5.             "\"Ike no Hotori (池のほとり, Ike no Hotori?)\""   2:21  NA   
 #>  7 6.             "\"Umi he (海へ, Umi he?)\""                       1:37  NA   
 #>  8 7.             "\"Namiuchigiwa (波打際, Namiuchigiwa?)\""         1:37  NA   
 #>  9 8.             "\"Higasa (日傘, Higasa?)\""                       2:26  NA   
 #> 10 9.             "\"Sakura no Shita (桜の下, Sakura no Shita?)\""   1:31  NA   
 #> 11 10.            "\"Dorobbusu (ドロップス, Dorobbusu?)\""           2:13  NA   
 #> 12 11.            "\"Hikkoshi (引越し, Hikkoshi?)\""                 2:17  NA   
 #> 13 12.            "\"Keimai (兄弟, Keimai?)\""                       2:15  NA   
 #> 14 13.            "\"Hotaru (ほたる, Hotaru?)\""                     4:12  NA   
 #> 15 14.            "\"Hotaru no Haka (ほたるの墓, Hotaru no Haka?)\"" 1:46  NA   
 #> 16 15.            "\"Yuuyake (夕焼け, Yuuyake?)\""                   0:53  NA   
 #> 17 16.            "\"Shura (修羅, Shura?)\""                         3:08  NA   
 #> 18 17.            "\"Hika (悲劇, Hika?)\""                           3:12  NA   
 #> 19 18.            "\"Futari ~ End Title (ふたり~エンドタイトル, Fu… 8:52  NA   
 #> 20 Duração total: "Duração total:"                                   58:13 NA   
 #> 
 #> [[3]]
 #> # A tibble: 3 × 2
 #>   Classificação Classificação   
 #>   <chr>         <chr>           
 #> 1 Brasil:       L[40]/12[34][35]
 #> 2 Japão:        G[41]           
 #> 3 Portugal:     M/12[37]        
 #> 
 #> [[4]]
 #> # A tibble: 3 × 6
 #>     Ano Premiação                    Categoria `Destinatário(s)` Resultado Ref. 
 #>   <int> <chr>                        <chr>     <chr>             <chr>     <chr>
 #> 1  1988 Blue Ribbon Awards           Prêmio E… Isao Takahata     Venceu    [30] 
 #> 2  1994 Chicago International Child… Prêmio d… Isao Takahata     Venceu    [30] 
 #> 3  1994 Chicago International Child… Prêmio d… Isao Takahata     Venceu    [30] 
 #> 
 #> [[5]]
 #> # A tibble: 4 × 2
 #>   X1                                                                       X2   
 #>   <chr>                                                                    <chr>
 #> 1 "Outros projetos Wikimedia também contêm material sobre Hotaru no Haka:" Outr…
 #> 2 ""                                                                       Cita…
 #> 3 ""                                                                       Cate…
 #> 4 ""                                                                       Base…
 #> 
 #> [[6]]
 #> # A tibble: 8 × 9
 #>   `vdeStudio Ghibli`     `vdeStudio Ghibli` `vdeStudio Ghibli` ``    ``    ``   
 #>   <chr>                  <chr>              <chr>              <chr> <chr> <chr>
 #> 1 "Hayao Miyazaki\nIsao… "Hayao Miyazaki\n… "Hayao Miyazaki\n…  <NA> <NA>   <NA>
 #> 2 "Filmografia"          "Longas-metragens… "Longas-metragens" "Ten… Curt… "On …
 #> 3 "Longas-metragens"     "Tenkū no Shiro R…  <NA>               <NA> <NA>   <NA>
 #> 4 "Curtas-metragens"     "On Your Mark (19…  <NA>               <NA> <NA>   <NA>
 #> 5 "Coproduções"          "Shiki-Jitsu (200…  <NA>               <NA> <NA>   <NA>
 #> 6 "Jogos eletrônicos"    "Jade Cocoon 2 (2…  <NA>               <NA> <NA>   <NA>
 #> 7 "Ver também"           "Ghibli Museum Li…  <NA>               <NA> <NA>   <NA>
 #> 8 ".mw-parser-output .s… ".mw-parser-outpu… ".mw-parser-outpu…  <NA> <NA>   <NA>
 #> # ℹ 3 more variables: `` <chr>, `` <chr>, `` <chr>
 #> 
 #> [[7]]
 #> # A tibble: 3 × 2
 #>   X1               X2                                                           
 #>   <chr>            <chr>                                                        
 #> 1 Longas-metragens "Tenkū no Shiro Rapyuta (1986)\nHotaru no Haka (1988)\nTonar…
 #> 2 Curtas-metragens "On Your Mark (1995)\nGiburīzu (2000)\nFirumu Guru Guru (200…
 #> 3 Coproduções      "Shiki-Jitsu (2000)\nInosensu: Kôkaku kidôtai (2004)\nLa Tor…
 #> 
 #> [[8]]
 #> # A tibble: 1 × 2
 #>   X1                     X2                                                     
 #>   <chr>                  <chr>                                                  
 #> 1 Controle de autoridade ": Q274520\n WorldCat\nVIAF: 316752206\nANN (animé): 1…

Manipulação e visualização dos dados

É verdade que a função rvest::html_table() nos presenteia com dados muito próximos dos desejados, precisando apenas de um ajuste aqui e/ou acolá. Esses “ajustes” são facilmente manipuláveis com as ferramentas da poderosa família tidyverse, como a dplyr, janitor, ggplot2… Porém, como o foco deste post é o web scraping e muito provavelmente você já é um expert em organizar (e apresentar) dados, não entraremos em detalhes em como os códigos desta seção foram construídos. Mas segue a premissa de que primeiro manipulamos os dados, e depois apresentamos os dados.

# manipulacao dos dados

tabela_ghibli <- tabela_ghibli |>
  # limpa os nomes das variaveis
  janitor::clean_names() |> 
  # renomeia variaveis
  dplyr::rename(roteirista = roteirista_s, produtor = produtor_es) |> 
  # recodificando variaveis
  dplyr::mutate(
    roteirista = recode(
      roteirista, 
      `Goro MiyazakiKeiko Niwa` = "Goro Miyazaki, Keiko Niwa",
      `Hayao MiyazakiKeiko Niwa` = "Hayao Miyazaki, Keiko Niwa",
      `Masashi AndoKeiko NiwaHiromasa Yonebayashi` = "Masashi Ando, Keiko Niwa, Hiromasa Yonebayashi",
      `Keiko NiwaEmi Gunji` = "Keiko Niwa, Emi Gunji"
    ),
    produtor = recode(
      produtor, 
      `Takashi ShojiSeiichiro Ujiie` = "Takashi Shoji, Seiichiro Ujiie",
      `Toshio SuzukiNozomu Takahashi` = "Toshio Suzuki, Nozomu Takahashi",
      `Toshio SuzukiTomohiko Ishii` = "Toshio Suzuki, Tomohiko Ishii",
      `Yoshiaki NishimuraSeiichiro Ujiie` = "Yoshiaki Nishimura, Seiichiro Ujiie",
      `Hayao MiyazakiToshio Suzuki` = "Hayao Miyazaki, Toshio Suzuki"
    )
  )

tabela_ghibli
 #> # A tibble: 23 × 6
 #>    ano   titulo                       diretor         roteirista produtor musica
 #>    <chr> <chr>                        <chr>           <chr>      <chr>    <chr> 
 #>  1 1986  Tenkū no Shiro Rapyuta       Hayao Miyazaki  Hayao Miy… Isao Ta… Joe H…
 #>  2 1988  Hotaru no Haka               Isao Takahata   Isao Taka… Toru Ha… Michi…
 #>  3 1988  Tonari no Totoro             Hayao Miyazaki  Hayao Miy… Toru Ha… Joe H…
 #>  4 1989  Majo no Takkyūbin            Hayao Miyazaki  Hayao Miy… Hayao M… Joe H…
 #>  5 1991  Omoide Poro Poro             Isao Takahata   Isao Taka… Toshio … Katsu…
 #>  6 1992  Kurenai no Buta              Hayao Miyazaki  Hayao Miy… Toshio … Joe H…
 #>  7 1993  Umi ga Kikoeru               Tomomi Mochizu… Keiko Niwa Toshio … Shige…
 #>  8 1994  Heisei Tanuki Gassen Ponpoko Isao Takahata   Isao Taka… Toshio … Shang…
 #>  9 1995  Mimi wo Sumaseba             Yoshifumi Kondo Hayao Miy… Toshio … Yuji …
 #> 10 1997  Mononoke Hime                Hayao Miyazaki  Hayao Miy… Toshio … Joe H…
 #> # ℹ 13 more rows

Na primeira aplicação, construímos um gráfico para visualizar de forma mais “fofinha” o ano de lançamento dos filmes do estúdio - e nada mais fofinho do que um gráfico cheio de Totorinhos, não é mesmo?

# grafico animado
  
ghibli <- "ghibli.png" # carrega imagem

tabela_ghibli |> 
  dplyr::filter(ano != "ASA") |> 
  # reordena os filmes por ano de lancamento
  dplyr::mutate(
    ano = as.numeric(ano),
    titulo = forcats::fct_reorder(titulo, ano)
  ) |> 
  ggplot2::ggplot(aes(x = ano, y = titulo)) +
  # adiciona imagem do totoro
  ggimage::geom_image(image = ghibli, size = .04) +
  # adiciona temas ao grafico
  ggplot2::theme_classic() +
  ggplot2::theme_light() +
  # adicona rotulos ao grafico
  ggplot2::labs(
    title = "Ano de lançamento dos filmes do Studio Ghibli",
    x = "", y = "Filme"
  )

Gráfico animado sobre o ano de lançamento dos filmes do Studio Ghibli.

Além de mostrarmos de maneira mais elegante o número de filmes dirigidos pelos seus cineastas. A propósito, oportunidade única para utilizar o pacote ghibli, que contém paletas de cores de vários filmes do Studio Ghibli, como “A Princesa Mononoke” (a escolhida), “Ponyo - Uma Amizade que Veio do Mar” e “A Viagem de Chihiro”.

# grafico de barras

tabela_ghibli |> 
  # agrupa filmes por diretor
  dplyr::group_by(diretor) |> 
  # conta a quantidade de filmes que cada diretor lancou
  dplyr::summarise(n = n()) |> 
  # reordena em ordem decrescente os diretores por quantidade de filme
  dplyr::mutate(diretor = forcats::fct_reorder(diretor, -n)) |> 
  ggplot2::ggplot(aes(x = diretor, y = n, fill = diretor)) +
  ggplot2::geom_bar(stat = "identity") +
  ggplot2::scale_y_continuous(breaks = seq(0, 10, by = 2)) +
  # adiciona temas ao grafico
  ggplot2::theme_classic() +
  ggplot2::theme_light() +
  # paleta de cores do filme 'princesa mononoke'
  ghibli::scale_fill_ghibli_d("MononokeMedium") +
  # adiciona rotulos nas barras do grafico
  ggplot2::geom_label(
    aes(label = n), position = position_dodge(width = 1), 
    show.legend = FALSE, color = "white"
  ) +
  # adiciona rotulo aos graficos
  ggplot2::labs(
    title = "Número de filmes do Studio Ghibli, por diretor", 
    x = "", y = "", color = "diretor"
  ) +
  ggplot2::theme(
    legend.title = element_blank(), # remove titulo da legenda
    legend.position = "bottom",     # posiciona legenda embaixo do grafico
    axis.text.x = element_blank(),  # remove valores do eixo x
    axis.ticks.x = element_blank()  # remove ticks do eixo x
  )

Gráfico de barras sobre o número de filmes produzidos no Studio Ghibli, por diretor.

Por último, como resultado da segunda aplicação, vamos construir uma tabela, uma espécia de ficha técnica, com as informações que foram coletadas do filme “O Túmulo de Vagalumes”. Obs.: optamos por uma análise simples nesse caso. Uma sugestão seria concatenar os dados dos boxs de todos os filmes em uma única base e calcular a média de duração dos filmes ou verificar qual o gênero mais comum entre eles, por exemplo.

# manipulando os dados

tumulo_vagalumes <- tumulo_vagalumes |> 
  # seleciona o primeiro elemento da lista
  purrr::pluck(1) %>%
  # remove linhas 1 e 2
  .[c(-1, -2), ]

colnames(tumulo_vagalumes) <- c("categoria", "descricao") # renomeia os nomes das variaveis

tumulo_vagalumes <- tumulo_vagalumes |> 
  # transforma base em formato wide (o que e linha vira coluna)
  tidyr::pivot_wider(names_from = "categoria", values_from = "descricao") |>
  # organiza os nomes das variaveis
  janitor::clean_names() |> 
  # renomeia variaveis
  dplyr::rename(
    titulo_br = no_brasil,
    titulo_pt = em_portugal,
    duracao_min = japao1988_cor_89_min,
    produtora = companhia_s_produtora_s,
    receita_milhoes = receita
  ) |> 
  # organiza variaveis
  dplyr::mutate(
    titulo_br = stringr::str_sub(titulo_br, end = 22),
    titulo_pt = stringr::str_sub(titulo_pt, end = 23),
    duracao_min = stringr::str_sub(duracao_min, start = 21, end = 22),
    elenco = recode(elenco, `Tsutomu TatsumiAyano ShiraishiYoshiko ShinoharaAkemi Yamaguchi` = "Tsutomu Tatsumi, Ayano Shiraishi, Yoshiko Shinohara, Akemi Yamaguchi"),
    genero = recode(genero, `drama[4]guerra[5]` = "drama, guerra"),
    lancamento = stringr::str_sub(lancamento, start = 22, end = 31),
    receita_milhoes = stringr::str_sub(receita_milhoes, start = 2, end = 5)
  )

tumulo_vagalumes
 #> # A tibble: 1 × 17
 #>   titulo_br     titulo_pt duracao_min genero direcao producao roteiro baseado_em
 #>   <chr>         <chr>     <chr>       <chr>  <chr>   <chr>    <chr>   <chr>     
 #> 1 O Túmulo dos… O Túmulo… 89          drama… Isao T… Toru Ha… Isao T… "\"Hotaru…
 #> # ℹ 9 more variables: elenco <chr>, musica <chr>, cinematografia <chr>,
 #> #   edicao <chr>, produtora <chr>, distribuicao <chr>, lancamento <chr>,
 #> #   idioma <chr>, receita_milhoes <chr>

A tabela:

# tabela 

tumulo_vagalumes |> 
  # retorna base em formato longo (o que e coluna vira linha)
  tidyr::pivot_longer(
    cols = 1:17, 
    names_to = "categoria", values_to = "descricao"
  ) |> 
  # cria tabela
  gt::gt() |> 
  gt::tab_header(
    title = "Túmulo de Vagalumes", 
    subtitle = "Ficha do filme"
  )
Túmulo de Vagalumes
Ficha do filme
categoria descricao
titulo_br O Túmulo dos Vagalumes
titulo_pt O Túmulo dos Pirilampos
duracao_min 89
genero drama, guerra
direcao Isao Takahata
producao Toru Hara
roteiro Isao Takahata
baseado_em "Hotaru no Haka", de Akiyuki Nosaka
elenco Tsutomu Tatsumi, Ayano Shiraishi, Yoshiko Shinohara, Akemi Yamaguchi
musica Michio Mamiya
cinematografia Nobuo Koyama
edicao Takeshi Seyama
produtora Studio Ghibli
distribuicao Toho
lancamento 1988-04-16
idioma japonês
receita_milhoes 590

Legal, né?

Para finalizar, deixo uma das definições de amor mais legais que já ouvi, que não poderia ter vindo se não pela mente brilhante de Hayao Miyazaki:

“Tornei-me cético em relação à regra não escrita de que só porque um menino e uma menina aparecem no mesmo filme, um romance deve acontecer. Em vez disso, quero retratar um relacionamento um pouco diferente, onde os dois se inspiram mutuamente para viver – se eu puder, então talvez eu esteja mais perto de retratar uma verdadeira expressão de amor.”

Hasta!