Bem-vindo ao Fórum!

Registre-se agora mesmo e fique por dentro da maior comunidade de Cheats do Brasil!

Cr4cko

Como criar um Site de Buscas (Google)

Recommended Posts

Posted (edited)

Faz tempo que não posto nada, então lá vai um post polemico. Vamos construir um Spider!

Spider é um script para capturar informações de sites. Vamos usa-lo para construir uma base de sites para poder criar um site de buscas. O código e como usar vai estar no fim do tópico. Abaixo vou explicar algumas coisas necessárias para você entender do funcionamento do Spider e também como podemos criar um site de buscas com esse script.

 

Observações

Nós nunca vamos chegar aos pés do Google, pois a cada segundo ele indexa diversas páginas, porém é tudo questão de tempo. Vamos criar um script que a partir de qualquer link, ele vai encontrar todos os links da página, salvar e mandar para uma fila de links para visitar. Sempre que ele visitar ele pega todos os links existentes, salva a URL, status que a página retorna e o conteúdo renderizado. Basicamente esse é o necessário para você começar a criar um Google.

 

Com isso eu já tenho um site de buscas pronto?

Claro que não. Esse tipo de script é conhecido como Spider. O nome Spider é justamente pois é como se uma aranha tivesse uma teia de sites. Vamos sair salvando em um banco de dados os dados NECESSÁRIOS para estudar melhores maneiras de apresentar resultados em um site de busca. O grande diferencial do Google é a forma que eles exibem os resultados. Eles possuem diversas regras e algoritmos para impedir sites que o titulo não condiz com a página interna, sites com vários links "clique aqui", sites que normalmente são usados para roubo, etc. Em nosso script vamos apenas criar a ferramenta para mapear todos os sites do planeta.

 

Quanto tempo demora?

Pode demorar a vida toda, 10 anos, 1 hora, o tempo que você quiser. O Spider inicia em 1 link qualquer e vai navegando em tudo o que existir. Por exemplo, se sua página de contato tem um link pro facebook, além de mapear todos os links do teu site, ele também vai em algum momento entrar no link do facebook e começar a mapear todas as páginas do facebook. Então o ideal é você criar excessões também, como: impedir mapear facebook, instagram, twitter, etc. Sites que não são de seu interesse.  Outro grande diferencial do Google é que eles estão a muitos anos mapeando sites, então devem ter alguns trilhões de sites indexados e sempre atualizados. Será que teu computador aguenta 1 semana com um script rodando? Tem diversos pontos que precisam ser levados em consideração...

 

Esse é o único script que tem?

Não. Esse script eu quem fiz, é a lógica que eu criei. Porém você pode construir o seu, pegar  o meu e deixa-lo mais performático, inclusive se quiser postar melhorias aqui eu posso adaptar também. Com certeza o script do google é mais avançado, mas basicamente entramos em um site, obtemos conteúdo, url e status.

 

Depois de mapear alguns sites, como transformar em um site de Buscas?

Depois de obter uma boa base de sites indexados, você precisa construir primeiramente seu site para trabalhar esses dados. Basicamente, uma página com um input para buscar e outra página para listar os sites com links. Entenda que isso é extremamente o básico. Quanto mais inteligência você colocar nessas duas páginas melhor. Com isso você vai precisar construir sua própria lógica para indexar e rankear os sites que você tem em sua base.  Isso é com você, deixe sua imaginação fluir, estude bastante com os sites de buscas existentes. Posso te ajudar com algumas lógicas, só chamar no MP. Mas isso requer um minimo de conhecimento em criação de sites e arquitetura de sistemas/sites/plataformas. Pretendo criar um parte 2 mais pra frente, onde eu uso a base de dados colhida pelo spider para exibir resultados no site de buscas de teste.

 

O que é status_code?

Status code é o status de retorno da página. Isso é muito importante para entender se o link acessado existe, se não ta escrito de forma errada (faltando alguns parametros do tipo ?id=1), se não redireciona para outra página e tudo mais. Para saber todos os status  code veja nesse link aqui, porém eu confesso que nem eu sei todos e a maioria nem aparece muito. Talvez num script de spider você possa ver boa parte dos status, mas ainda sim existem muitos.

 

HORA DO COPIAR E COLAR

Bom, recomendo não pular pra cá sem ler a parte de cima. Enfim, abaixo vou colocar a versão do código comentada explicando e a versão limpa.

No exemplo, eu estou mapeando apenas a WEBCHEATS. Para deixar o spider mapear o mundo, procure por:

if 'webcheats.com.br' in link['href'] and link['href'] not in LIST_LINKS:


e troque por:

if link['href'] not in LIST_LINKS:

 

Código com comentários explicativos

import time
import json
import requests
from bs4 import BeautifulSoup, SoupStrainer
from random import randint

LIST_LINKS = []
LIST_VISITED = []
WEB = []
URL_START = 'https://www.webcheats.com.br'

"""
    Nosso método run inicia o Spider.
    Vamos usar a biblioteca requests para fazer requisições nas páginas
    e obter os dados de retorno. No nosso caso, vamos focar em:
    - status_code
    - content
    - url
"""
def run():
    spider_finished = False
    with requests.Session() as session:
        response = session.get(URL_START, headers={'User-Agent': 'Mozilla/5.0'})
        
        # Entramos a primeira vez no site da WebCheats e pegamos todos os links.
        # Pegando todos os links, já temos uma fila inicial para visitar.
        get_all_links(response, URL_START)
                
        # Enquanto spider_finished não for true, ficar no loop.
        # O spider_finished vai ser True quando a lista de links encontrados
        # For do mesmo tamanho dos links visitados: len(LIST_LINKS) == len(LIST_VISITED)
        while not spider_finished:
            print(spider_finished)
            spider_finished = ( len(LIST_LINKS) == len(LIST_VISITED) )
            for actual_url in LIST_LINKS:
                if not actual_url in LIST_VISITED:
                    try:
                        # criar um delay de segundos aleatorios (5s a 10s)
                        time_sleep = randint(5, 10)
                        time.sleep(time_sleep)
                        
                        response = session.get(actual_url, headers={'User-Agent': 'Mozilla/5.0'})
                        get_all_links(response, actual_url)
                        print("( %s/%s ) [%s] (%s)" % ( len(LIST_VISITED), len(LIST_LINKS), response.status_code, actual_url ) )
                        LIST_VISITED.append(actual_url)
                        WEB.append({
                            "status_code": str(response.status_code),
                            "url": actual_url,
                            "content": str(response.content),
                        })
                    except:
                        WEB.append({
                            "status_code": "BROKEN",
                            "url": actual_url,
                        })
                        pass
                else:
                    while actual_url in LIST_LINKS: LIST_LINKS.remove(actual_url)
                    
    print( "Spider finalizado. (SpiderLog: %s) (LIST_LINKS: %s)" % ( len(LIST_VISITED), len(LIST_LINKS) ) )
    
    # Criar um arquivo .json com os dados obtidos.
    WEB_JSON = json.dumps([ob.__dict__ for ob in WEB])
    timestr = time.strftime("%Y%m%d-%H%M%S")
    with open('data_%s.json' % timestr, 'w') as outfile:
        json.dump(WEB_JSON, outfile)
        
"""
    O parametro HTML contem o conteúdo obtido no request do loop do Spider.
    Vamos ler esse conteúdo inteiro com a biblioteca BeautifulSoup.
    Vamos extrair todos os links existentes nesse HTML renderizado e 
    armazenar na lista LIST_LINKS.
    
    Aqui você pode criar diversas condições para evitar links inúteis/quebrados.
    No caso eu coloquei 4 condições: 
    - se o elemento da página <a> tem o atributo href e existe algo no atributo href.
    - se o link do atributo href tem http na string. se não tiver, 
        atualiza concatenando link_da_pagina_acessada + path
    - se o link é exclusivo da webcheats (vms mapear só a WC no exemplo)
    - Se nosso link final não estiver na LIST_LINKS, armazena.
"""
def get_all_links(html, source_link):
    all_links = BeautifulSoup(html.content, 'html.parser',  parse_only=SoupStrainer('a'))
    for link in all_links:
        if link.has_attr('href') and link['href']:
            
            # Se não tem http no link (ex.: <a href='/cr4cko'>logout</a>), complementar com url
            # resultado: https://www.webcheats.com.br/users + /cr4cko.
            if 'http' not in link['href']:
                link['href'] = "%s%s" % (source_link, link['href'])
                
            # Se o link é apenas da WebCheats e a url não é vazia e não está na 
            # lista de links pra visitar, adiciona no LIST_LINKS.
            if 'webcheats.com.br' in link['href'] and link['href'] not in LIST_LINKS:
                LIST_LINKS.append(link['href'])
                
# Iniciando o spider
run()

 

Código sem comentários (   58 linhas e temos um spider 😘  ) 

import time
import json
import requests
from bs4 import BeautifulSoup, SoupStrainer
from random import randint

LIST_LINKS = []
LIST_VISITED = []
WEB = []
URL_START = 'https://www.webcheats.com.br'

"""
    Nosso método run inicia o Spider.
    Vamos usar a biblioteca requests para fazer requisições nas páginas
    e obter os dados de retorno. No nosso caso, vamos focar em:
    - status_code
    - content
    - url
"""
def run():
    spider_finished = False
    with requests.Session() as session:
        response = session.get(URL_START, headers={'User-Agent': 'Mozilla/5.0'})
        get_all_links(response, URL_START)
        while not spider_finished:
            print(spider_finished)
            spider_finished = ( len(LIST_LINKS) == len(LIST_VISITED) )
            for actual_url in LIST_LINKS:
                if not actual_url in LIST_VISITED:
                    try:
                        time_sleep = randint(5, 10)
                        time.sleep(time_sleep)
                        response = session.get(actual_url, headers={'User-Agent': 'Mozilla/5.0'})
                        get_all_links(response, actual_url)
                        print("( %s/%s ) [%s] (%s)" % ( len(LIST_VISITED), len(LIST_LINKS), response.status_code, actual_url ) )
                        LIST_VISITED.append(actual_url)
                        WEB.append({ "status_code": str(response.status_code), "url": actual_url, "content": str(response.content), })
                    except:
                        WEB.append({ "status_code": "BROKEN", "url": actual_url, })
                        pass
                else:
                    while actual_url in LIST_LINKS: LIST_LINKS.remove(actual_url)
    print( "Spider finalizado. (SpiderLog: %s) (LIST_LINKS: %s)" % ( len(LIST_VISITED), len(LIST_LINKS) ) )
    # Criar um arquivo .json com os dados obtidos.
    WEB_JSON = json.dumps([ob.__dict__ for ob in WEB])
    timestr = time.strftime("%Y%m%d-%H%M%S")
    with open('data_%s.json' % timestr, 'w') as outfile:
        json.dump(WEB_JSON, outfile)
        
def get_all_links(html, source_link):
    all_links = BeautifulSoup(html.content, 'html.parser',  parse_only=SoupStrainer('a'))
    for link in all_links:
        if link.has_attr('href') and link['href']:
            if 'http' not in link['href']:
                link['href'] = "%s%s" % (source_link, link['href'])
            if 'webcheats.com.br' in link['href'] and link['href'] not in LIST_LINKS:
                LIST_LINKS.append(link['href'])
run()

 

Antes de rodar o código, você precisa ter o python instalado e o pip. Para instalar o pip, copie o código desse link e cole no arquivo no desktop chamado get-pip.py. Abra seu CMD, navegue até o desktop e roda python get-pip.py.

Após instalar o pip, crie 2 arquivos em uma pasta para seu spider chamado: spider.py e requeriments.txt.

No arquivo spider.py você joga o código do spider (a primeira ou a segunda versão, é a mesma coisa apenas uma com comentários e outra sem).

No arquivo requeriments.txt:

beautifulsoup4==4.7.1
bs4==0.0.1
certifi==2019.3.9
chardet==3.0.4
idna==2.8
requests==2.21.0
soupsieve==1.9
urllib3==1.24.1

 

No seu terminal, vá até essa pasta com esses 2 arquivos e rode: pip install -r requeriments.txt

Ele vai instalar as bibliotecas necessárias para rodar o spider.

Depois de instalar, rode: python spider.py e apenas aprecie.

No final ele cria um arquivo json com todos os dados que você conseguiu.

No meio do código tem um time.sleep(timer_sleep) que eu uso que é um random entre 5 -10 segundos. Criei isso pra não ser banido pelo site. Demora mais, porem se jogar num servidor você pode ficar a vida toda mapeando sites, anos e décadas.

 

pnzmXd7.png

 

Créditos: eu, python, google. e nóis.

Edited by Cr4cko
faltou um trocinho
  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.