Naive Crawler in Clojure

Algum tempo atrás praticando clojure tentei fazer um crawler de web bem simples e sem dependências, apenas para testar alguns recursos. O resultado foi um programa em clojure capaz de navegar nos links a partir de uma página e salvar os conteúdos.

Resolvi acertar uns detalhes e colocar no github o naive-crawler.

O desenvolvimento foi bem incremental, primeiro as funções para lidar com links:

  • make-url recebe uma url atual e um link achado para definir o destino.
  • find-links acha links através de regex, bem falho na verdade.
  • find-urls combina as duas anterior já retornando as urls para serem navegadas .
  • same-domain? checa se o destino é do mesmo domínio da página atual.

Depois persistência:

  • make-db cria um banco de dados.
  • insert insere uma referencia a uma url no db, se ainda não existir.
  • get-it retorna o conteúdo da url salva no db.
  • non-crawled filtra as urls ainda sem conteúdo.
  • set-content salva o conteúdo no db.

Crawler em si:

  • save-page busca o conteúdo da pagina atual, salva-o e captura as urls dessa página.
  • start/-main iniciam o loop do crawler

O desenvolvimento foi bem incremental, no começo apenas fazia url a url, depois adicionei o “same-domain”, controle de erro bem básico, paralelismo simples (testei outras formas também) e depois salvar em disco.

Interessante seria salvar as URLs numa fila (PerssitenQueue? Redis?) e outras threads consumirem essa fila e salvar o conteúdo em um banco de dados (sqlite? neo4j?). E também não tem testes, pois fui fazendo tudo no REPL e esqueci de escrever os testes.