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 ...</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:
- Qual o método usado na pesquisa de jurisprudência do TJSP?
- Qual o método usado na busca avançada de diários de justiça do TJSP?
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áginahttps
com certificados inadequados numa requisição GET, rodeGET('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 emhtml_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 umdata_frame
.html_attr()
extrai um atributo de uma tag, por exemplohref
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
.
para entender sobre server side e user side, acesse server side e user side.↩