Last active
August 29, 2015 14:15
-
-
Save devton/3ffd474ca17d5615c189 to your computer and use it in GitHub Desktop.
app/services/crawler/web.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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