Skip to content

marcioferreira/CrawlerBadPractices

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 

Repository files navigation

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!

  • 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:

About

Como fazer um crawler ineficiente

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Perl 100.0%