15.4 - Scraping - Download de páginas

Para qualquer scraper, é fundamental a habilidade de realizar download de páginas web da internet. Os “downloads” de páginas, documentos, imagens ou qualquer tipo de arquivo que realizamos frequentemente na internet são simples requisições HTTP; por isso, é importante conhecer os principais métodos de requisição definidos no protocolo HTTP.

GET

O método GET é usado para recuperar qualquer informação referenciada por uma URL.

POST

O método POST é usado para enviar um conjunto de dados para um serviço especificado por uma URL e recuperar a informação resultante do processamento desses dados.

O método HEAD é idêntico ao GET, mas o servidor não retorna o conteúdo do corpo da página referenciada pela URL requisitada. Este método é utilizado, principalmente, para recuperar metainformações presentes no header da resposta da requisição HTTP.

Exemplo com NET::HTTP

Para ilustrar o download de conteúdo da Internet, utilizaremos a biblioteca Net::HTTP para a linguagem de programação Ruby. Ela oferece os métodos GET,POST e HEAD apresentados acima.

Execute o código abaixo no interpretador interativo de Ruby:

  require 'net/http'

  #
  # GET
  #

  uri  = URI.parse('http://www.google.com.br/')
  body = Net::HTTP.get(uri)

  # write the output to a file
  File.open('get.html', 'w') { |f| f.write(body) }


  #
  # POST
  #

  # you should use developer tools to sniff the traffic that is being transferred
  # through your browser.
  uri = URI.parse('http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaCepEndereco.cfm')

  data = {
    'relaxation'          => '05050000',
    'tipoCEP'       => 'ALL',
    'semelhante'       => 'N',
  }

  response  = Net::HTTP.post_form(uri, data)
  body = response.body

  # write the output to a file
  File.open('post.html', 'w') { |f| f.write(body) }


  #
  # HEAD
  #

  uri = URI.parse('http://www.google.com/')
  response = Net::HTTP.start(uri.host, uri.port) do |http|
    http.head '/about/'
  end

  headers = response.each_header.map { |h, i| "#{h} = #{i}" }

  # write the output to a file
  File.open('head.html', 'w') do |f|
    f.write(headers.join("\n"))
  end