Skip to content

Instantly share code, notes, and snippets.

@devton
Last active August 29, 2015 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devton/3ffd474ca17d5615c189 to your computer and use it in GitHub Desktop.
Save devton/3ffd474ca17d5615c189 to your computer and use it in GitHub Desktop.
app/services/crawler/web.rb
module Crawler
class Web
attr_reader :valid_urls
# Metodo de classe que já coleta e retorna um array unico
# com todos os links percorridos dentro do site
def self.collect_links_from url
_ = new url
_.collect_links!
_.valid_urls.uniq
end
# Setup inicial do crawler com a primeira URL
def initialize url
@url = URI url
# Coleção com as URLs que já foram acessadas
# valor padrão é a url de entrada
@valid_urls = [@url.to_s]
# Coleção de URLs que ainda não foram acessadas
@urls_buffer = []
# Salvamos o valor do host para verificações em URLs
# que possam redicionar
@host = @url.host
end
# Começa a coletar todos os links de um site
def collect_links!
# Entra no link
@request = follow_link
# Se o link for processado com sucesso
# começamos a processar no buffer
process_buffer if @request && response_ok?
end
protected
# Processa toda a informação de links internos do site
def process_buffer
# Salva os links internos no buffer
save_buffer
# Percorre o buffer verificando se as URLs
# não foram verificadas, caso já tenha sido
# a url é removida do buffer e nenhuma ação é tomada
@urls_buffer.each do |url|
# remove a url do buffer para uma variavel
from_buffer = @urls_buffer.delete(url)
Rails.logger.info "[web/crawler] - processing url #{from_buffer}"
# verifica se a URL já não foi acessada
unless @valid_urls.include? from_buffer
# Quando a url ainda não foi acessada
# ela é adicionada na coleção de URL acessadas
@valid_urls.push from_buffer
# Seta um novo valor para variavel de instancia @url
@url = from_buffer
Rails.logger.info "[web/crawler] - inserted #{from_buffer} into valid_urls"
# Começa a coletar os links do novo link
# que veio do buffer
collect_links!
end
end
end
# salva os links da página atual no buffer
def save_buffer
parsed_links = remove_query_from_links
# pegamos apenas os links que ainda não foram acessados
# de acordo com nossa coleção de urls validas
diff_links = parsed_links - @valid_urls
# adiciona no buffer os links diferentes
@urls_buffer.concat(diff_links)
end
# Remove as query strings de uma URL (/?foo=bar&bar=foo) é retorna
# apenas uma coleção com o host/path definido
def remove_query_from_links
@request.links.internal.map do |link|
url = URI link
url.query = nil
url.to_s
end
end
# Verifica se o status code de uma request foi OK
def response_ok?
@request.response.status == 200
end
# Faz o acesso da URL
def follow_link url = @url
uri = URI url
# Se o host da url passada não for o mesmo
# host do primeiro site que gerou essa consulta
return if uri.host != @host
Rails.logger.info "[web/crawler] checking url -> #{uri}"
# Metainspector para fazer a request ná página
# e coletar os links internos
MetaInspector.new(uri, headers: { 'User-Agent' => 'mySearchServerCrawler'})
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment