Como fazer um crawler ineficiente
Perl
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
README.pod

README.pod

Como fazer um crawler ineficiente

  • Delegue a normalização dos links ao método canonical() do URI. E daí que o path pode ter coisas como ../../../, ou parâmetros da query podem vir em ordens distintas?

  • Compile libcurl com suporte a c-ares sempre que o seu crawler for de tipo horizontal (pegar muitas páginas do mesmo servidor).

  • Distribua o seu crawler horizontal em maior número de nodes possível.

  • Sempre use WWW::Mechanize. Jamais se importe com stack_depth.

  • Use e abuse do HTML::TreeBuilder::XPath. Web::Scraper::LibXML é para os fracos!

  • Melhor ainda: processe HTML usando expressões regulares

  • Alcançando o nirvana: baixe os documentos usando wget -r -np e os processe com expressões regulares!

  • Use fork para criar conexões paralelas. E DBD::SQLite para gerenciá-las. Todos sabem que, quanto mais conexões, mais rápido o download! Comece com um número razoável, por exemplo 100.

  • Num sistema SMP, nada melhor do que threads para distribuir as tarefas entre as CPUs. E, no Windows, ithreads garantem a melhor escalabilidade para o seu crawler.

  • Repudie eval, Try::Tiny e afins. É impossível o crawler gerar exception ao percorrer sites alheios. Corolario: ignore a questão de retries, afinal, tudo vai funcionar perfeitamente logo na primeira tentativa!

  • Guarde todos os resultados crawleados na RAM. Grave-os no storage permanente somente no final da execução.

  • Nem sempre salve os dados obtidos. Mas, quando salvar, certifique-se de gerar um arquivo com instruções SQL, para carregar da forma mais segura possível na sua base de dados. Ou, melhor ainda, grave um XML (cuidado para não cair na armadilha de usar XML::Compile!), empregando CDATA para escape.

  • Sabe aquele negócio chato de site.com.br/www.site.com.br? Resolva com um simples s/^www\.//!

  • Lembre-se: a única codificação que existe é ISO-5589-1. Se você se deparar com caracteres UTF-8, não hesite em usar s///g para convertê-los na única codificação que é verdadeira!

  • Ignore robots.txt e, especialmente, sitemap.xml.

  • Com certeza, você sabe parsear headers (inclusive cookies) muito melhor do que os idiotas que submeteram os respectivos módulos para o CPAN. Não perca tempo com essas dependências triviais.

  • Não esquente a cabeça com a condição de parada do crawler. Uma hora ou outra, essa bagaça tem que parar!

  • Considere a beleza inerente da solução recursiva. Por um instante, esqueça de que o Perl é, na sua essência, imperativo.

  • Preocupe-se com a beleza do código do seu crawler. Crawler bom é crawler clean. Utilize o LWP::Simple, ou, melhor ainda: implemente em Ruby.

  • Tenha em mente que Scrapy, Nutch, Methabot, Heritrix e afins são tudo uns lixos. Certamente, o seu crawler ficará muito melhor!

  • Não use nenhum cache de DNS, afinal o host pode mudar repentinamente e você não pode ficar fora dessa!

  • Ignore a abrangência do HTTP quanto a caches; Last-Modified e ETag são armadilhas, você não pode cair nessa!

  • Não perca tempo com Firebug ou jsFiddle, debug on the fly é sempre uma delícia =)

  • Siga todas essas dicas à risca, ou o seu crawler correrá o risco de ficar eficiente!

Referências

Ao fazer um crawler ineficiente, ignore a opinião dos seguintes elementos: