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 prima o botão “Run” acima do editor de código. Verá na sua consola o progresso da instalação do pacote.
A instalação ocorre uma única vez, pelo que agora pode comentar ou eliminar a linha anterior:
#install.packages('rvest')
Agora tem de carregar (ou importar) a biblioteca:
library(rvest)
Vou usar 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, vou 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, digite no console:
help(function_name)
O RStudio abrirá um servidor HTTP com um link direto para a documentação. Para read_html, a saída será:
Para obter a lista de avaliações, vou usar a função html_elements. Ela 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 iterar para obter a data e a classificação de cada elemento individual:
Os programadores R utilizam o operador pipe “%>%” para tornar a codificação mais versátil. A sua função é passar o valor do operando esquerdo como argumento para o operando direito.
Pode encadear os operandos (como verá mais adiante neste guia), o que o ajudará a reduzir bastante o número de variáveis locais. A linha de código anterior, escrita sem o operador pipe, ficaria assim:
reviews <- html_elements(book_html, 'div.review')
Para recolher os dados, vou inicializar dois vetores fora do loop. 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, enquanto percorro a lista de avaliações, procuro dois valores: data e classificação. Como viu 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 atribuiu uma estrela, então o elemento span terá o nome de classe p10, enquanto os restantes terão o nome de 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)
}
Reparem na função html_element; não é um erro ortográfico. Podem usar html_elements quando quiserem 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 avaliação). 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 data frame para centralizar os dados:
result = data.frame(date = dates, rating = ratings)
E o resultado final ficará assim: