SlideShare uma empresa Scribd logo
1 de 32
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

Mais conteúdo relacionado

Destaque

Curso YaCy Mecanismo de Busca de Código Aberto
Curso YaCy Mecanismo de Busca de Código AbertoCurso YaCy Mecanismo de Busca de Código Aberto
Curso YaCy Mecanismo de Busca de Código AbertoJulio Della Flora
 
Capturando dados com Python - UAI Python
Capturando dados com Python - UAI PythonCapturando dados com Python - UAI Python
Capturando dados com Python - UAI PythonÁlvaro Justen
 
Top 5 Tools for Web Scraping
Top 5 Tools for Web ScrapingTop 5 Tools for Web Scraping
Top 5 Tools for Web ScrapingPromptCloud
 
Scraping for fun and glory
Scraping for fun and gloryScraping for fun and glory
Scraping for fun and gloryitalomaia
 
Java Web Scraping
Java Web ScrapingJava Web Scraping
Java Web ScrapingSumant Raja
 
Capturando a web com Scrapy
Capturando a web com ScrapyCapturando a web com Scrapy
Capturando a web com ScrapyGabriel Freitas
 
Current challenges in web crawling
Current challenges in web crawlingCurrent challenges in web crawling
Current challenges in web crawlingDenis Shestakov
 
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturadoRaspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturadoFernando Macedo
 
Almost Scraping: Web Scraping without Programming
Almost Scraping: Web Scraping without ProgrammingAlmost Scraping: Web Scraping without Programming
Almost Scraping: Web Scraping without ProgrammingMichelle Minkoff
 
Web Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciênciaWeb Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciênciaSidney Roberto
 
Desenvolvendo web crawler/scraper com Python
Desenvolvendo web crawler/scraper com PythonDesenvolvendo web crawler/scraper com Python
Desenvolvendo web crawler/scraper com PythonRoselma Mendes
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Daniel Makiyama
 
Scraping data from the web and documents
Scraping data from the web and documentsScraping data from the web and documents
Scraping data from the web and documentsTommy Tavenner
 

Destaque (18)

Parsing XML Data
Parsing XML DataParsing XML Data
Parsing XML Data
 
Web - Crawlers
Web - CrawlersWeb - Crawlers
Web - Crawlers
 
Curso YaCy Mecanismo de Busca de Código Aberto
Curso YaCy Mecanismo de Busca de Código AbertoCurso YaCy Mecanismo de Busca de Código Aberto
Curso YaCy Mecanismo de Busca de Código Aberto
 
Capturando dados com Python - UAI Python
Capturando dados com Python - UAI PythonCapturando dados com Python - UAI Python
Capturando dados com Python - UAI Python
 
Scraping by examples
Scraping by examplesScraping by examples
Scraping by examples
 
Top 5 Tools for Web Scraping
Top 5 Tools for Web ScrapingTop 5 Tools for Web Scraping
Top 5 Tools for Web Scraping
 
Scraping for fun and glory
Scraping for fun and gloryScraping for fun and glory
Scraping for fun and glory
 
Java Web Scraping
Java Web ScrapingJava Web Scraping
Java Web Scraping
 
Web Crawlers
Web CrawlersWeb Crawlers
Web Crawlers
 
Scraping
ScrapingScraping
Scraping
 
Capturando a web com Scrapy
Capturando a web com ScrapyCapturando a web com Scrapy
Capturando a web com Scrapy
 
Current challenges in web crawling
Current challenges in web crawlingCurrent challenges in web crawling
Current challenges in web crawling
 
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturadoRaspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturado
 
Almost Scraping: Web Scraping without Programming
Almost Scraping: Web Scraping without ProgrammingAlmost Scraping: Web Scraping without Programming
Almost Scraping: Web Scraping without Programming
 
Web Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciênciaWeb Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciência
 
Desenvolvendo web crawler/scraper com Python
Desenvolvendo web crawler/scraper com PythonDesenvolvendo web crawler/scraper com Python
Desenvolvendo web crawler/scraper com Python
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
 
Scraping data from the web and documents
Scraping data from the web and documentsScraping data from the web and documents
Scraping data from the web and documents
 

Web Crawler com Perl: automação e extração de dados da Web