Como Criar Robôs de Busca para a Internet

31 March 2008 - 21:42                        

Eu programo e estudo freqüentemente robôs que fazem buscas em sites da Internet. Eles nada mais são do que programas de computador capazes de fazer o download e processamento de diversas páginas em pouco tempo. Uma das pessoas que mais me ensinaram sobre este assunto é o Bruno Gola, que conheci quando trabalhamos juntos em projetos open source.

Depois de muitos testes, erros, acertos e comparações, conclui que a forma mais eficiente de criar um Robô de Busca é fazendo sua divisão em três programas principais:

1. Download de Conteúdo

Nesta parte, é criado um software capaz de baixar todas as páginas do site buscado com conteúdo que seja relevante para o que se pretende fazer.

É importante que esteja bem claro o que se deseja buscar antes de criar um Robô, pois assim você sabe exatamente quais páginas deve baixar. Depois, você deve pensar em uma maneira eficiente de baixar todas estas páginas.

A maneira que eu considero menos eficiente, porém mais simples, é realizar o download de todas as páginas do site. Para fazer isto a cada página que você faz download você deve armazenar todos os links para onde ela aponta e entrar em todos os links que têm o domínio do site. Isto é na verdade a descrição de um Crawler: ele entra em uma página, captura links, entra neles, captura mais links, entra neles, captura mais ….. até ter entrado em todos os links, aí começa tudo de novo a partir do primeiro link, buscando conteúdo novo e links novos.

2. Análise do Conteúdo

Nesta seção, deve ser criado um software capaz de processar o conteúdo das páginas previamente baixadas. Normalmente, este programa alimenta alguma estrutura de armazenamento de dados a partir de estatísticas e elementos coletados.

Esta é uma parte mais trabalhosa pois requer algoritmos eficientes tanto para processar o conteúdo baixado quanto para alimentar o banco de dados.

Uma dica importante neste item é que muitas funções que realizam processamento ou troca de informações com banco de dados são muito utilizadas para diversos sites diferentes que estão sendo buscados. Como você tem que fazer um software analisador para cada site é interessante que você crie uma biblioteca de funções mais utilizadas que será compartilhada entre eles.

3. Visualização do Conteúdo

Esta é uma parte que envolve o conhecimento prévio do usuário da aplicação. Você deve pensar para quem está coletando estes dados e qual a melhor forma de apresentá-los. A partir do momento que você tem um banco de dados bem preenchido, basta apenas pensar na interface de visualização dos dados.

Se for uma aplicação aberta para qualquer pessoa, é muito provável que a interface de visualização seja uma página na web.

Esta divisão, além de ser bem eficiente é também de fácil manutenção pois permite alta modularização de aplicações. Comento com mais detalhes cada parte em posts futuros.

Categorias: Robôs de Busca |

Você pode reproduzi-lo! Indique apenas o Link!

Email    

Leia Artigos Relacionados



Você pode acompanhar os comentários deste artigo através do feed RSS 2.0 Você pode deixar um comentário ou, ou interligar ("trackback") com seu site.

AddThis Social Bookmark Button

38 Responses “Como Criar Robôs de Busca para a Internet”

  1. naoa entendi pois oque eu estou procurando e um robo movel que pode fazer as mesmas coisas que a pessoa tipo:
    assistir televisao
    caminhar
    beber
    e ate como possivel conversar

  2. entao sepossivel tente mandar uma planta de um robo pra eu montar me mande uma planta pello meu msn
    o meu msn e guzao1998@hotmail.com

  3. ricardo escreveu:

    Poxa Gustavo, além de completamente perdido você está vendo muita ficção cientifica hein?

    Então, gostaria de alguma dica de literatura, em portugues se possivel, sobre esses web bots, como criar um, etc.

    Vlw

  4. Claudio escreveu:

    Ola Boa Noite, Rafael qual o tipo de programação mais indicado para esta finalidade “Liguagem”…

    Obrigado

  5. alberto escreveu:

    pocha,na verdade para criar um robô vocÊ precisa ter um auto grau de estudo…um bom conhecimento na verdade eu tou tentando mais preciso aprender muito++++.

  6. Luis Andrade escreveu:

    Parabens pelo texto. Claro e objetivo! Não sou programador e estou a procura de um robo que possa identificar a citação à um determinado assunto (no meu caso nanotecnologia) em sites de instituições de ensino. Tens alguma dica? Saudações, Luís

  7. Rafael Barbolo Lopes escreveu:

    Pro pessoal que quer se informar mais sobre a implementação desses bots, eu sugiro conhecer a linguagem de programação Python. É muito simples de aprender e bastante eficiente para esta tarefa. Sugiro que veja um pouco sobre a biblioteca urllib: http://docs.python.org/library/urllib.html

    Luis Andrade, existem várias maneiras de fazer o que você precisa. Uma delas é usar a própria busca do google pelo termo “nanotecnologia” e filtrando os sites apenas para os quais você deseja obter resultados. O Google também fornece uma ferramente “Google Custom Search” que permite fazer algo nesse sentido em pouco tempo: http://code.google.com/apis/customsearch/

    Abraços

  8. Guw escreveu:

    Ola Rafael,

    O que vc me diz sobre sites seguros, como sites de grandes jornais. Mesmo com usuario e senhas de acesso, não consegui desenvolver nada eficaz em termos de robos. Você acha possivel? Como burlar os Robots.txt?

    Abraço

  9. Rafael Barbolo Lopes escreveu:

    Olá Guw,

    Se vc consegue acessar uma página com um navegador (ex: firefox), você consegue programar um aplicativo que acesse a página de maneira automatizada.

    Acessar uma página http, nada mais é que fazer uma requisição tcp. E servidores web devem ter uma porta aberta para essas conexões (normalmente porta 80).

    Que linguagem de programação vc usa?

    Se for python, eu sei que é possível modificar a urllib para ela não checar o Robots.txt, você também pode modificar o seu user-agent, simulando o firefox por exemplo.

    Eu já fiz isso e funcionou.

    Se quiser mais ideias e ajuda é só falar.

    Abraços

  10. Marcelo escreveu:

    Rafael,

    Você tem alguma experiência com robôs que consiga funcionar em sites que colocam imagens para evitar este tipo de ação.

    Abs

  11. Rafael Barbolo Lopes escreveu:

    Marcelo, eu tenho sim.

    Há menos de 1 ano eu fiz um sistema pra buscar a base de currículos do lattes e eles tinham captcha. Era simples de “quebrar”.

    Alguns são mais complicados.

    Precisa de ajuda?

  12. Poxa, desenvolvi um robô em PHP seguindo o esquema e funciona!Só falta desenvolver mais profundamente a parte do algoritmo para avaliar as paginas.

    No robô, utilizei PHP(http://php.net) com Expressões Regulares(http://aurelio.net) e consegui um robô que encontrou mais de 100 links , mais de 800 palavras e mais de 15 imagens só na página inicial do Baixaki.

    Se vou publica-lo?Só se for para vencer o Google!!

    Hahahahaha

    observação:Tecnicamente , vencer o Google só após o Algoritmo tiver avaliando à risca cada página , com peso,quantidade de imagens,scripts,tempo de carga, links apontando e por aí vai.

  13. Marcelo escreveu:

    Fala Rafael, Sim estou precisando de saber de maneira geral qual o caminho que utilizou, ferramentas, etc. Estou precisando quebrar alguns robôs para ler informações de sites automaticamente.

  14. Rafael Barbolo Lopes escreveu:

    Pra quebrar captcha eu vejo 3 possibilidades principais:

    1. Alguns sistemas de captcha são muito simples, você passa como parâmetros o desafio e a resposta dele. Então resolvendo um desafio, você consegue fazer quantas requisições quiser, resolvendo sempre o mesmo CAPTCHA.

    2. Se for simples aplicar um OCR na imagem do CAPTCHA e acertar o desafio, então você consegue resolver desafios diferentes.

    3. Se você não conseguir aplicar um OCR na imagem e resolver o desafio automaticamente (acontece com CAPTCHAs do Google e reCAPTCHA, por exemplo), então o melhor jeito é você criar uma interface gráfica para que um operador humano fique constantemente resolvendo desafios. Não sei quantos desafios tem que ser resolvido para o que você vai fazer, mas se forem poucos, é relativamente tranquilo usar esta estratégia.

  15. Marcelo escreveu:

    Fala Rafael,
    Muito obrigado pelas dicas… Vou seguir suas estratégias!!

    Abs

  16. ROBÔ DE BUSCA escreveu:

    Bom dia Rafael, estou tentando desenvolver o robô de busca para baixa paginas de um site específico, e depois organizar este conteúdo em um XML, a que questão é sempre que o usuário precisar pegar um conteúdo do site ele tem que digitar o código referente a pagina que ele precisar meu robô tem que pegar este código e baixa está pagina e organizar em um XML , minha duvidar é como eu faço para passar este código como parâmetro, o site utiliza post para pegar a pagina e eu estou desenvolvendo o sistema em Java.

  17. Rafael Barbolo Lopes escreveu:

    Você quer saber como envia parâmetros POST junto com a requisição de download de uma url.

    A resposta está neste link:
    http://www.exampledepot.com/egs/java.net/Post.html

    Se fossem parâmetros GET, seria bem simples.
    url = “http://www.google.com.br/search”
    parametro = q ; valor = “post+url+download+java”

    É só abrir a url:
    url_parametroGET = “http://www.google.com.br/search?q=post+url+download+java”

  18. Patrick Idalgo escreveu:

    Boa Noite Rafel,

    Primeiramente ótimo post, gostaria de saber se é possivel trabalhar com o php, e se vc teria um base dísponivel?

    Obrigado.

  19. Rafael Barbolo Lopes escreveu:

    Um dos meus sócios no Amo DinDin já mexeu com esse tipo de coisa em php. Ele usava a lib CURL:

    http://br2.php.net/curl

    O contato dele é ivan @ amodindin . com . br

    Se precisar de ajuda, fale com ele ou poste aqui.

    Abraços

  20. Solicitação POST escreveu:

    Refael, muito obrigado pela informação que vc mim passo, mais ainda estou tendo problemas com este código.

    Tem como vc verificar este código não estou conseguindo fazer um requisição POST, eu tenho que acessar este site: “http://www.licitacoes-e.com.br/aop/index.jsp” , e neste site tenho que digitar este código :275041 ou qualquer outro código referente a um licitação,
    Mais quero fazer isto dentro da minha aplicação Java, a pessoal digita um código e o programa acessa este site http://www.licitacoes-e.com.br/aop/index.jsp e inserir o código, este site faz solicitação POST.

    try {
    // Construct data
    String data = URLEncoder.encode(”275041″, “UTF-8″);// + “=” + URLEncoder.encode(”", “UTF-8″);
    //data += “&” + URLEncoder.encode(”key2″, “UTF-8″) + “=” + URLEncoder.encode(”value2″, “UTF-8″);

    // Send data
    URL url = new URL(”http://hostname:80/cgi”);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    wr.write(data);
    wr.flush();

    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
    // Process line…
    }
    wr.close();
    rd.close();
    } catch (Exception e) {
    }

  21. William Marques escreveu:

    Refael, muito obrigado pela informação que vc mim passo, mais ainda estou tendo problemas com este código.

    Rafael tem como vc verificar este código não estou conseguindo fazer um requisição POST, eu tenho que acessar este site: “http://www.licitacoes-e.com.br/aop/index.jsp” , e neste site tenho que digitar este código :275041 ou qualquer outro código referente a um licitação,
    Mais quero fazer isto dentro da minha aplicação Java, a pessoal digita um código e o programa acessa este site http://www.licitacoes-e.com.br/aop/index.jsp e inserir o código, este site faz solicitação POST.

  22. William Marques escreveu:

    try {
    // Construct data
    String data = URLEncoder.encode(”numeroLicitacao”,”UTF-8″) + “=” + URLEncoder.encode(”273315″, “UTF-8″);
    //data += “&” + URLEncoder.encode(”", “UTF-8″) + “=” + URLEncoder.encode(”5151″, “UTF-8″);

    // Send data
    URL url = new URL(”http://www.licitacoes-e.com.br/aop/index.jsp”);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    wr.write(data);
    wr.flush();

    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
    // Process line…
    System.out.println(line);
    }
    wr.close();
    rd.close();
    } catch (Exception e) {
    }

    }

    }

  23. Que viagem do Gustavo, será que ele leu sobre qual robô que o autor está falando ?

  24. Arthur escreveu:

    Rafael o que vc quer dizer com resolver desafio em relação aos captchas?

  25. Rafael Barbolo Lopes escreveu:

    Arthur,

    Definição de Captcha pela Wikipedia:

    “Teste de desafio cognitivo, utilizado como ferramenta anti-spam…”

    http://pt.wikipedia.org/wiki/CAPTCHA

    Quando digo resolver desafio, quero dizer resolver o captcha, ou seja, encontrar a solução que satisfaz o captcha.

  26. Patricia escreveu:

    Bom dia Rafael, parabens pelo post e pelos comentarios acima. Estou iniciando um projeto aki no meu servico para desenvolver um robo que acesse e insira dados em uma pagina de intranet, a pag foi desenvolvida em JSP e eu nao tenho acesso nenhum ao servidor, ou seja, a aplicacao deve ser desenvolvida como se um usuario estivesse usando um brouser para a tarefa. Por favor, me de algumas dicas do que comecar a estudar, muito obrigada.

  27. Rafael Barbolo Lopes escreveu:

    Patricia, a maneira mais simples de fazer o que você precisa (simular um browser) é usando o Selenium-RC:
    http://seleniumhq.org/projects/remote-control/

    Pra usá-lo, você sobe um servidor do selenium na sua máquina. E escreve um programa que usa um cliente do selenium-rc que envia comandos pra esse servidor. Então o servidor abre um browser do seu computador e envia os comandos pra ele. É bem tranquilo de usar!

    Se você quiser simular um browser, mas sem abrir o browser, então você tem que usar alguma biblioteca que faça requisições http. Se você me disser qual linguagem de programação pretende usar, eu posso recomendar uma biblioteca e documentação mais específicas.

    Se não tiver restrição quanto a linguagem de programação, eu recomendo que você use Ruby. Tem uma “biblioteca” muito boa pra Ruby, é a Nokogiri. Pra conhecer mais, veja o vídeo do link abaixo (mostra como simular browser):

    http://railscasts.com/episodes/190-screen-scraping-with-nokogiri

  28. Patricia escreveu:

    Rafael, minha intencao eh simular o browser, mas sem abri-lo, de maneira que a aplicacao acesse o site, capture dados, e os salve em um bd. Quero trabalhar com java e mysql, por ja ter alguma experiencia, ainda que pouca. E desde ja agradeco a ajuda, bjuss!!!

  29. Rafael Barbolo Lopes escreveu:

    Patrícia,

    Em Java existe uma classe chamada URL. Ela permite que você acesso o conteúdo de páginas da Internet.
    Tem um exemplo de uso aqui: http://bit.ly/adZTvM

    Se a aplicação for um pouco mais complexa, eu não recomendo o uso de Java. É uma linguagem com sintaxe muito ruim e eu acho péssima para fazer E/S (entrada e saída de dados). Também acho muito ruim para manipular strings.

    Eu gosto de duas linguagens de programação para fazer isso que você precisa: Python e Ruby. Tenho usado mais Ruby ultimamente porque possui pacotes muito bons, como o nokogiri que eu postei anteriormente.

    Me manda e-mail barbolo @ gmail . com se precisar de ajuda com Java. Eu tenho alguns exemplos de programas que já fiz com essa sua finalidade, talvez ajudem.

  30. Allan Christian escreveu:

    Rafael, tambem estou tentando fazer algo parecido com o que a Patricia quer, vi o video do link acima e é justamente o que preciso. Vc sabe de alguma apostila/tutorial que me ensine a trabalhar com essa biblioteca Nokogiri? pesquisa simples, como as do video, eu consegui, mas nao sei, por exemplo, como logar em um site para posteriomente salvar as informacoes.

  31. Rafael Barbolo Lopes escreveu:

    A patrícia também está com o problema de autenticação em um site.

    Eu vou tentar fazer o mais breve possível um post sobre isso e postar no http://www.bitabit.eng.br/

    Só preciso pegar um site que precisa de autenticação e que não vai mudar muito ao longo do tempo. Aí já posto um exemplo mais completo.

  32. Jailson escreveu:

    Olá,

    Gostaria de saber se existe algum tutorial para criação de uma robô de busca, havendo poderia disponibiliza-lo ?

    Desde já grato.

  33. Cesar morais escreveu:

    Boa niote

    Gostaria de saber se é posivel vazer um site de busca com as carateristicas do cade ou google pois tenho o dominio http://www.abcbusca.com.br e gostaria te colocar no ar para comesar a ser conhecido, comesando pequeno e ver o que vai dar!!!
    deste ja meu muito obrigado

    Cesar morais
    Cesaracm001@hotmail.com
    49-9975-2664

  34. Antonio Augusto Castelo Branco escreveu:

    Caro Rafael, preciso de um robô de busca específico e gostaria de saber se você desenvolve para terceiros. Favor entrar em contato diretamente por meu e-mail.

  35. Rafael Barbolo Lopes escreveu:

    Cesar,

    É possível fazer isso que você quer, mas não entendo por que você faria isso. Dificilmente seu site vai ficar conhecido só porque tem um bom domínio. Meu conselho pra você é deixar seu domínio “parked”.

    Antonio, no momento não estou com tempo para fazer esse trabalho. Mas entre em contato no meu email (rafael @ barbolo.com.br) e me diga o que você precisa que de repente eu posso ajudá-lo de alguma maneira.

  36. Tenho interesse em converssar com vc sobre negócios. Estou desenvolvendo um site e gostaria de contar com os seus conhecimentos em criar robôs.
    Se tiver ineteresse mande-me um email e vamos converssar.
    Abs
    Angel

  37. Joao escreveu:

    Gostaria de entrar em contato com vc para lhe apresentar um plano de negocios. Como posso entrar em contato. Caso nao seja de seu interesse, vc me indicaria alguma pessoa ou empresa para criar robos ?

    Obrigado.

  38. Rafael Barbolo Lopes escreveu:

    Claro!

    Entre em contato comigo que eu ajudo, faço ou passo para alguém que faça o que você precisa.

    rafael@barbolo.com.br

    Abraços

Deixe um comentário