Introdução ao R
O R é uma versão de código aberto da linguagem de programação S, combinada com a semântica do Scheme. Surgiu pela primeira vez em meados de 1993, tornou-se de código aberto em 1995 e teve a sua primeira versão beta estável em 2000.

Ross Ihaka e Robert Gentleman criaram o R com o objetivo de «transformar ideias em software de forma rápida e fiel».
O R é uma linguagem de programação funcional e é muito conhecida entre os cientistas de dados. As suas principais aplicações são:
- banca;
- finanças;
- comércio eletrónico;
- aprendizagem automática;
- qualquer outro setor que utilize grandes quantidades de dados.
Em comparação com o SAS e o SPSS, o R é a ferramenta de análise mais utilizada no mundo. A sua comunidade ativa e solidária conta com quase 2 milhões de utilizadores.
Se analisarmos algumas das empresas que integram o R nos seus negócios e a forma como o fazem, veremos que:
- Facebook: para atualizar o estado e a sua rede social;
- Google: prever a atividade económica e melhorar a eficiência da publicidade online;
- Foursquare: pelo seu motor de recomendações;
- Trulia: para prever os preços das casas e as taxas de criminalidade locais.
No entanto, em comparação com outras linguagens, o R está em constante concorrência com o Python. Ambas oferecem ferramentas de web scraping e contam com comunidades ativas.
As diferenças tornam-se evidentes quando analisamos o público-alvo. O Python tem uma sintaxe muito fácil de aprender e muitas funcionalidades de alto nível. Isto torna-o mais apelativo para principiantes e utilizadores sem conhecimentos técnicos.
O R pode parecer um pouco intimidante à primeira vista, mas está mais focado na análise estatística. Oferece um conjunto mais vasto de ferramentas integradas de análise e visualização de dados. Por isso, pode ser uma opção mais adequada para projetos em que se lida com grandes quantidades de dados, como a extração de dados da Web.
Sobre a rvest
O Rvest é um dos pacotes mais populares utilizados para a extração de dados da Web em R. Oferece funcionalidades de análise poderosas, mas simples. O BeautifulSoup do Python serve de inspiração e faz parte da coleção tidyverse.
Ótimo, mas por que usar o rvest se o R tem bibliotecas nativas que fazem o mesmo trabalho? A primeira boa razão é o facto de o rvest ser um wrapper dos pacotes httr e xml2. Isto significa que ele trata tanto da solicitação GET como da análise do HTML.
Assim, utiliza-se uma biblioteca em vez de duas e o código fica muito mais limpo e conciso. Além disso, o rvest também pode receber uma cadeia de caracteres como entrada e tratar da análise do XML e do download do ficheiro.
No entanto, devemos ter em conta que os sites apresentam mais conteúdo gerado dinamicamente. As razões são diversas: desempenho, experiência do utilizador e muitas outras. O Rvest não consegue lidar com a execução de JavaScript, pelo que é aqui que deve procurar uma alternativa.
Extracção de dados com R
Muito bem, chega de teoria. Vamos ver como o R se comporta num caso prático. Para este tutorial, escolhi a página do Goodreads de um livro muito famoso: «1984», de George Orwell. Pode encontrar o site aqui: https://www.goodreads.com/book/show/61439040-1984.
Quero ver como a popularidade deste livro evoluiu ao longo dos anos. Para estimar isso, vou recolher a lista de críticas e extrair a data e a classificação de cada uma delas. Como passo final, vou guardar os dados num ficheiro externo que possa ser posteriormente processado por outros programas.
Configurar o ambiente
Mas, antes de mais, tem de se certificar de que tem tudo o que precisa para escrever o código.

No que diz respeito ao IDE, tem duas opções:
- instalar um plugin R para o Visual Studio Code;
- Faça o download do RStudio, concebido para facilitar a programação em R.
Neste tutorial, vou utilizar esta última. Pode descarregá-la aqui: https://www.rstudio.com/products/rstudio/download/.

A versão gratuita do RStudio Desktop é suficiente para se familiarizar com os conceitos básicos. Tal como antes, siga as instruções de instalação.
Abra o RStudio e crie uma nova pasta vazia. Vou escrever o código num novo ficheiro chamado«goodreads-rvest.r».
Apresentamos o navegador
Agora, antes de extrair os dados, tem de decidir quais os dados que pretende. O Rvest suporta tanto seletores CSS como XPath, por isso escolha o que preferir.
Se pretendes iniciar projetos de scraping mais complexos, recomendo que tenhas conhecimentos básicos de HTML e CSS. Aqui tens um bom espaço para começares a experimentar.
Se não estiver familiarizado com HTML, existem também algumas opções que não requerem conhecimentos técnicos. Por exemplo, o Chrome disponibiliza a extensão SelectorGadget. Esta permite-lhe clicar em qualquer ponto da página e mostra-lhe o seletor CSS necessário para obter os dados.
No entanto, nem todos os sites são tão simples como o Goodreads. Vou optar por extrair os dados utilizando seletores CSS identificados através da inspeção manual do código HTML.
Aceda ao URL de destino no seu navegador e desça até à secção «Avaliações da comunidade». Em seguida, clique com o botão direito do rato nessa secção e selecione «Inspecionar» para abrir as Ferramentas do programador.

O contêiner com o ID«other_reviews»é aquele em que me vou concentrar. Agora, utilize o botão «Inspecionar» para encontrar o seletor CSS da data e da classificação de uma avaliação.

Assim, pode observar o seguinte:
- cada avaliação individual é um elemento div com a classe«review»;
- a data da avaliação é um único elemento âncora com a classe«reviewDate»;
- A classificação da avaliação é um elemento `span` com a classe«staticStars». Tem cinco elementos `span` como filhos, correspondentes ao número de estrelas que um utilizador pode atribuir. Vamos analisar os que estão coloridos, que têm a classe«p10».
Extrair as avaliações
Depois de verificar todos os pré-requisitos, pode finalmente começar a escrever o código.
install.packages('rvest')
Coloque o cursor no final da linha e clique no botão «Executar» acima do editor de código. Verá no seu terminal o progresso da instalação do pacote.
A instalação é feita uma única vez, por isso agora pode comentar ou eliminar a linha anterior:
#install.packages('rvest')
Agora tem de carregar (ou importar) a biblioteca:
library(rvest)
Vou utilizar a função read_html para enviar um pedido GET ao site de destino, o que irá descarregar o documento HTML necessário. Desta forma, irei descarregar o documento HTML necessário:
book_html <- read_html("https://www.goodreads.com/book/show/61439040-1984")
O resultado está agora armazenado na variável book_html, que também pode ver simplesmente digitando no console:

Se, a qualquer momento, precisar de consultar a documentação oficial de uma função que pretenda utilizar, escreva no console:
ajuda(nome_da_função)
O RStudio irá abrir um servidor HTTP com um link direto para a documentação. No caso da função `read_html`, o resultado será:

Para obter a lista de comentários, vou utilizar a função html_elements. Esta função receberá como entrada o seletor CSS que encontrei anteriormente:
reviews <- book_html %>% html_elements('div.review')
O resultado será uma lista de nós XML, que irei percorrer para obter a data e a classificação de cada elemento individual:

Os programadores em R utilizam o operador de canalização «%>%» para tornar a programação mais versátil. A sua função é passar o valor do operando de esquerda como argumento para o operando de direita.
É possível encadear os operandos (como verá mais adiante neste guia), o que pode ajudar a reduzir significativamente o número de variáveis locais. A linha de código anterior, escrita sem o operador de barra vertical, ficaria assim:
reviews <- html_elements(book_html, 'div.review')
Para recolher os dados, vou inicializar dois vetores fora do ciclo. Ao dar uma vista de olhos rápida no site, posso garantir que ambos os vetores terão o mesmo comprimento.
dates <- vector()
ratings <- vector()
Agora, ao percorrer a lista de comentários, procuro dois valores: a data e a classificação. Como viram anteriormente, a data é um elemento âncora que possui a classe reviewDate .
A classificação é um elemento `span` com a classe `staticStars` e contém cinco elementos `span` para cada estrela. Se o utilizador atribuir uma estrela, o elemento `span` terá a classe `p10` , enquanto os restantes terão a classe `p0` .
O código ficará assim:
for (review in reviews) {
review_date = review %>% html_element('a.reviewDate') %>% html_text()
dates <- c(dates, review_date)
review_rating_element = review %>% html_element('span.staticStars')
valid_stars = review_rating_element %>% html_elements('span.p10')
review_rating = length(valid_stars)
ratings <- c(ratings, review_rating)
}
Repare na função html_element; não se trata de um erro ortográfico. Pode utilizar html_elements quando pretender extrair uma lista de nós XML e html_element para um único nó.
Neste caso, apliquei esta última a uma secção mais pequena do documento HTML (uma crítica). Também utilizei a função html_text para me ajudar a obter o conteúdo de texto do elemento que encontrei.
Por fim, vou juntar os dois vetores num único quadro de dados para centralizar os dados:
result = data.frame(data = dates, rating = ratings)
E o resultado final ficará assim:

Guardar os resultados
Todos sabemos que a extração de dados não serve de nada se não se guardar os resultados em algum lugar. No R, para gravar num ficheiro CSV basta:
write.csv(result, "reviews.csv")
O resultado tem de ser uma matriz ou um data frame (o que já é o caso); caso contrário, o programa tenta efetuar uma conversão. Execute o código e verifique o diretório do projeto. Verá que pode abrir a tabela anterior num editor de texto, num ficheiro do Excel, etc.
O resultado tem de ser uma matriz ou um data frame (o que já é o caso); caso contrário, o programa tenta efetuar uma conversão. Execute o código e verifique o diretório do projeto. Verá que pode abrir a tabela anterior num editor de texto, num ficheiro do Excel, etc.
Escusado será dizer que a nossa lista de dados tem apenas 30 entradas. O site apresenta mais de 90 000 comentários e mais de 3 milhões de avaliações. Então, o que aconteceu? Bem, a paginação.
Além disso, volte ao seu navegador e clique na segunda página. Irá verificar que a lista muda, mas o URL permanece o mesmo. Isto significa que utilizam um estado para carregar dinamicamente outra secção da lista.
Nestas situações, o rvest pode não ser útil. Em vez disso, um navegador automatizado pode ajudar a simular o comportamento de cliques para carregar o resto da lista. Um exemplo de uma biblioteca deste tipo é o Rselenium, mas deixarei este assunto para um exercício complementar.
Conclusão
Espero que este tutorial lhe tenha proporcionado uma base sólida para o web scraping com o R. Agora poderá tomar uma decisão mais informada sobre a pilha tecnológica do seu próximo projeto.
No entanto, tenha em atenção que este artigo não abordou muitos dos desafios do web scraping. Pode encontrar uma descrição mais detalhada desses conceitos neste guia intuitivo.




