Delegue a normalização dos links ao método
canonical()
do URI. E daí que opath
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 simpless/^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!
Ao fazer um crawler ineficiente, ignore a opinião dos seguintes elementos: