3.3 Pacotes httr, xml2 e rvest

Esses são os três pacotes mais modernos do R para fazer web scraping.

O pacote xml2 tem a finalidade de estruturar arquivos HTML ou XML de forma eficiente, tornando possível a obtenção de tags e seus atributos dentro de um arquivo. Já o pacote httr é responsável por realizar requisições web para obtenção das páginas de interesse, buscando reduzir ao máximo a complexidade da programação. O pacote rvest é escrito sobre os dois anteriores e por isso eleva ainda mais o nível de especialização para raspagem de dados.

A utilização dos pacotes tem uma regra de bolso. Para trabalhar com páginas simples, basta carregar o rvest e utilizar suas funcionalidades. Caso o acesso à página exija ações mais complexas e/ou artifícios de ferramentas web, será necessário utilizar o httr. O xml2 só será usado explicitamente nos casos em que a página está em XML.

Esses pacotes não são suficientes para acessar todo tipo de conteúdo da web. Um exemplo claro disso são páginas em que o conteúdo é produzido por javascript, o que acontece em alguns sites modernos. Para trabalhar com esses sites, é necessário realmente “simular” um navegador que acessa a página web. Uma das melhores ferramentas para isso é o selenium. Não discutiremos selenium nesse curso, mas caso queira se aprofundar, acesse aqui e o pacote RSelenium.

3.3.1 GET e POST

Uma requisição GET envia uma url ao servidor, possivelmente com alguns parâmetros nessa url (que ficam no final da url depois do ?). O servidor, por sua vez, recebe essa url, processa os parâmetros e retorna uma página HTML para o navegador2.

A requisição POST, no entanto, envia uma url não modificada para o servidor, mas envia também uma lista de dados preenchidos pelo usuário, que podem ser números, textos ou até imagens. Na maioria dos casos, ao submeter um formulário de um site, fazemos uma requisição POST.

O httr possui os métodos GET e POST implementados e são muito similares. A lista de parâmetros enviados pelo usuário pode ser armazenado numa list nomeada, e adicionado ao GET pelo parâmetro query ou no POST pelo parâmetro body.

Exemplo de GET

httr::GET("http://google.com/search", query = list(q = "jurimetria"))
#> Response [http://www.google.com/search?q=jurimetria]
#>   Date: 2018-01-24 11:26
#>   Status: 200
#>   Content-Type: text/html; charset=ISO-8859-1
#>   Size: 41.9 kB
#> <!doctype html><html itemscope="" itemtype="http://schema.org/SearchResu...
#> statistics, to law. The subject has gained considerable currency in both...
#> States and Brazil. In the United States, the journal Jurimetrics is publ...
#> American Bar Association and Arizona State University. In Brazil, the fi...
#> focus&nbsp;...</span><br></div></div><div class="g"><h3 class="r"><a hre...
#> no Direito. Índice. [esconder]. 1 Histórico; 2 Os Três Prismas da <b>Jur...
#> Elaboração Legislativa e Gestão Pública; 2.2 A Decisão Judicial; 2.3 A I...
#> Probatória. 3 <b>Jurimetria</b> vs Law and Economics; 4 Referências; 5 L...
#> prácticas. Esta guía aborda de forma general la conceptualización de las...
#> prácticas, las fases del procedimiento para documentarlas y aplicarlas a...
#> ...

Exemplo de POST

httr::POST("http://httpbin.org/post", 
           body = list(x = "Mãe to na request"), 
           encode = "json")
#> Response [http://httpbin.org/post]
#>   Date: 2018-01-24 11:26
#>   Status: 200
#>   Content-Type: application/json
#>   Size: 526 B
#> {
#>   "args": {}, 
#>   "data": "{\"x\":\"M\u00e3e to na request\"}", 
#>   "files": {}, 
#>   "form": {}, 
#>   "headers": {
#>     "Accept": "application/json, text/xml, application/xml, */*", 
#>     "Accept-Encoding": "gzip, deflate", 
#>     "Connection": "close", 
#>     "Content-Length": "26", 
#> ...

3.3.2 Exercícios

Use o Inspect:

  1. Qual o método usado na pesquisa de jurisprudência do TJSP?
  2. Qual o método usado na busca avançada de diários de justiça do TJSP?

3.3.3 Sessões e cookies

No momento que acessamos uma página web, o navegador baixa alguns arquivos que identificam nosso acesso à página. Esses arquivos são chamados cookies e são usados pelos sites para realizar diversas atividades, como carregar uma página pré-definida pelo usuário caso este acesse o site pela segunda vez ou fazer propagandas.

O httr e o rvest já guardam esses cookies de forma automática, de forma que o usuário não precise sa preocupar com isso. Em casos raros, para construir o web scraper é necessário modificar esses cookies. Nesses casos, estude a função cookies() do httr.

3.3.4 Outras funções do httr

Outras funções úteis:

  • write_disk() para escrever uma requisição direto em disco, além de guardar na memória RAM.
  • config() para adicionar configurações adicionais. Por exemplo, quando acessar uma página https com certificados inadequados numa requisição GET, rode GET('https://www...', config(ssl_verifypeer = FALSE)).
  • oauth_app() para trabalhar com APIs. Não discutiremos conexão com APIs nesse curso, mas é um importante conceito a ser estudado.

3.3.5 Principais funções do rvest

Para acessar páginas da web:

  • html_session() abre uma sessão do usuário (baixa página, carrega cookies etc).
  • follow_link(), jump_to() acessa uma página web a partir de um link (tag <a>) ou url.
  • html_form() carrega todos os formulários contidos numa página.
  • set_value() atribui valores a parâmetros do formulário.
  • submit_form() submete um formulário obtido em html_form.

Para trabalhar com arquivos HTML:

  • read_html() lê o arquivo HTML de forma estruturada e facilita impressão.
  • html_nodes() cria uma lista com os nós identificados por uma busca em CSS path ou XPath. html_node() é um caso especial que assume que só será encontrado um resultado.
  • html_text() extrai todo o conteúdo de um objeto e retorna um texto.
  • html_table() extrai o conteúdo de uma <table> e transforma em um data_frame.
  • html_attr() extrai um atributo de uma tag, por exemplo href da tag <a>.

Se quiser ver exemplos, entre em http://material.curso-r.com/scrape/

3.3.6 CSS path e XPath

O CSS path e o XPath são formas distintas de buscar tags dentro de um documento HTML. O CSS path é mais simples de implementar e tem uma sintaxe menos verborrágica, mas o XPath é mais poderoso. A regra de bolso é tentar fazer a seleção primeiro em CSS e, caso não seja possível, implementar em XPath.

Esses paths serão mostrados en passant durante o curso, mas não serão abordados em detalhe. Caso queira se aprofundar no assunto, comece pela ajuda da função ?html_nodes.


  1. para entender sobre server side e user side, acesse server side e user side.