mantovani@perl.org.br
São Paulo Perl Monger
Yet Another Perl Conference
Web Crawler
Daniel de O. Mantovani
Aware
mantovani@perl.org.br
São Paulo Perl Monger
Web Crawler
Web Crawler é um software que faz uma
navegação automatizada na Web.
mantovani@perl.org.br
São Paulo Perl Monger
Mercado
O Google usa Web Crawler, sem esse conceito
não tem Google.
mantovani@perl.org.br
São Paulo Perl Monger
Usabilidade
up-to-date
mantovani@perl.org.br
São Paulo Perl Monger
Outras Empresas
JáCotei
Buscapé
Bing
Yahoo
Zura
Aware
mantovani@perl.org.br
São Paulo Perl Monger
Perl
Maturidade
CPAN
Cultura
Comunidade
mantovani@perl.org.br
São Paulo Perl Monger
Maturidade
23 anos de evolução
mantovani@perl.org.br
São Paulo Perl Monger
CPAN
18588 módulos e enquanto eu falo, a
comunidade Perl produz Perl
mantovani@perl.org.br
São Paulo Perl Monger
Cultura
TIMTOWTDI
“There Is More Than One Way To Do It”
mantovani@perl.org.br
São Paulo Perl Monger
Comunidade
IRC
irc.perl.org #sao-paulo.pm #rio-pm …
Lista
sao-paulo.pm.org/lista
rio.pm.org/lista.pl
mantovani@perl.org.br
São Paulo Perl Monger
Antes
Regular Expression
Caos
Inferno
Manutenção ? Não existe isso
mantovani@perl.org.br
São Paulo Perl Monger
From Hell
while ($string =~ m{<a class="EsquerdaMenu"
href="(ListaProdutos.asp?IDLoja=d+&Y=d+(?:&cch=)?
&IDCategoria=d+)".*?>(.+?)</a>}sig) {
my $link = 'http://www.foo.com.br/sistema/'.$1;
my $cat = $2;
$link =~ s/Y=d+/Y=/io;
if($cat !~ m/Novidades/io) {
push(@{$spider->{linhas_cfg}}, $spider-
>dicionario($spider->retira_html($cat)) . ";$link");
}
}
mantovani@perl.org.br
São Paulo Perl Monger
O código anterior não é
code-golf
É um código usado num ambiente real de
produção.
Não me perguntem o que o código anterior faz
mantovani@perl.org.br
São Paulo Perl Monger
Evolução
HTML::Element->HTML::TreeBuilder-
>HTML::TreeBuilder::XPath
mantovani@perl.org.br
São Paulo Perl Monger
XPath
XPath é usado para navegar através de
elementos e atributos em um documento XML
mantovani@perl.org.br
São Paulo Perl Monger
Exemplo
//div[@class=”menu”][1]
mantovani@perl.org.br
São Paulo Perl Monger
Termologia
Nodes
Items
mantovani@perl.org.br
São Paulo Perl Monger
Relacionamento
Parent
Children
Siblings
Ancestors
Descendants
mantovani@perl.org.br
São Paulo Perl Monger
Parent
Cada elemento e atributo tem um parent.
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
O elemento book é pai do title,author, year e
price.
mantovani@perl.org.br
São Paulo Perl Monger
Children
Children pode ter zero, one ou mais childrens.
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
O elemento, title, author, year e price são
todas childrens do elemento book.
mantovani@perl.org.br
São Paulo Perl Monger
Siblings
São nodes que tem o mesmo elemento.
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
O node title, author, year e price são todos
siblings.
mantovani@perl.org.br
São Paulo Perl Monger
Ancestors
São todos os antepassados do elemento.
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
O ancestors do title é o book e o bookstore.
mantovani@perl.org.br
São Paulo Perl Monger
Descendants
São todos os descendentes do elemento.
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
Os descendants do elemento bookstore são
book, e todos irmãos do title. (e o title)
mantovani@perl.org.br
São Paulo Perl Monger
WWW::Mechanize
Um módulo Perl feito para automatizar as ações
de um browser.
Ele cuida de todos os os métodos HTTP, ele cuida de até um
certo nível de parsing como links e imagens, suporte SSL,
cookies, permite customizar o cabeçalho HTTP, te redireciona
automaticamente, Proxy e autentificação HTTP.
Entre outros.
mantovani@perl.org.br
São Paulo Perl Monger
Mechanize ;)
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
agent_alias => 'Linux Mozilla',
stack_depth => 5
);
$mech->get($url);
print $mech->content;
mantovani@perl.org.br
São Paulo Perl Monger
HTML::TreeBuilder::XPath
my $tree = HTML::TreeBuilder::XPath->new_from_content($content);
my $menu = $xpath->findnodes('//ul[@class="sMenu"]')->[0];
my $sub_menus = $menu->findnodes('.//ul');
mantovani@perl.org.br
São Paulo Perl Monger
Firebug
Uma ótima ferramenta
mantovani@perl.org.br
São Paulo Perl Monger
Problemas
JavaScript
Captcha
Bloqueio de IP
HTML que não é HTML
mantovani@perl.org.br
São Paulo Perl Monger
Captcha
use Image::OCR::Tesseract 'get_ocr';
my $image = './hi.jpg';
my $text = get_ocr($image);
mantovani@perl.org.br
São Paulo Perl Monger
Imagemagick
resize
mantovani@perl.org.br
São Paulo Perl Monger
Requisições
Live HTTP Header
mantovani@perl.org.br
São Paulo Perl Monger
Agradecimento
Daniel Ruoso
Eden Cardim
Gabriel Vieira

Web crawler