15.5 - Scraping - Navegação Web

Uma importante atividade desempenhada por um scraper é a navegação web. A navegação consiste em abrir diferentes páginas de um site com o objetivo de coletar dados ou executar consultas.

Para alguns sites, a navegação pode ser realizada utilizando a biblioteca Net::HTTP. Com ela, um fluxo de execução do scraper poderia ser: abrir uma URL, coletar links relevantes nesta URL e abrir estes links. Para muitos sites, este fluxo é comum (pense, por exemplo, na navegação pelas categorias de um site de uma loja online).

Para alguns sites, esse fluxo só pode ser executado se a sessão do usuário for mantida durante as requisições. As técnicas mais comuns para reconhecer a sessão do usuário são: leitura de cookies ou passagem de identificador de sessão na URL. Para o primeiro caso, o cliente HTTP da sua linguagem deve implementar gerenciamento de cookies.

É possível gerenciar cookies utilizando a Net::HTTP, mas esta seria uma tarefa muito trabalhosa. Quando ela é necessária, é recomendado utilizar alguma biblioteca que implementa este gerenciamento e outras funcionalidades encontradas em um navegador. Este é o caso da biblioteca Mechanize.

Mechanize é uma biblioteca em ruby bastante usada quando é necessário o gerenciamento automático de cookies, mantém salvo os sites que visitou em um histórico e preenche formulários.

Para instalar o Mechanize, basta executar o seguinte comando no terminal:

  gem install mechanize

Abaixo são apresentados dois exemplos didáticos. O primeiro é a tentativa de implementar navegação em um site que armazena sessão, porém sem gerenciar cookies. O segundo é esta tentativa implementada com o Mechanize, que realiza gerenciamento de cookies automaticamente.

Navegação sem gerenciamento de cookies

  require 'net/http'

  # Add a product to the shopping cart
  uri = URI.parse 'https://www.goldentoys.com.br/carrinho/produto/9742497/adicionar'
  Net::HTTP.get(uri)

  # Open the shopping cart
  uri  = URI.parse 'https://www.goldentoys.com.br/carrinho/index'
  body = Net::HTTP.get(uri)

  # Write output to html file
  File.open('cart-no-cookies.html', 'w') { |f| f.write(body) }

Navegação com gerenciamento de cookies

require 'mechanize'

# Create a new Mechanize user agent (it's like a web browser instance)
agent = Mechanize.new

# Add a product to the shopping cart
agent.get 'https://www.goldentoys.com.br/carrinho/produto/9742497/adicionar'

# Open the shopping cart

agent.get 'https://www.goldentoys.com.br/carrinho/index'

# Write output to html file
File.open('cart-with-cookies.html', 'w') { |f| f.write(agent.page.body) }