Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
D ado o volume
atual de dados
existentes na Web,
mtica de cdigos, minerao de endereos de e-mail,
coleta de contedos especficos para cotao de preos
de um determinado produto ou servio e tambm pode
um processo auto- ser desenvolvido para agregar dados de diversas fontes
mtico e metdi- da internet podendo persistir essas informaes em um
co de indexao banco de dados.
de contedo se Esses agentes no esto limitados a uma linguagem
especfica, na verdade, desde que seja possvel extrair
faz extrema-
e aplicar expresses regulares em cima dos contedos
mente ne-
obtidos, qualquer linguagem pode ser utilizada para a
cessrio.
implementao de web crawlers. No entanto, agora, no
E nesse estamos levando em considerao a viabilidade de se
cenrio implementar um crawler em cada linguagem. Cada uma
que o Web possui suas particularidades, o que pode dificultar ou
crawler se faz facilitar o desenvolvimento. Dito isso, para este artigo o
presente buscando, fil- Java foi a linguagem escolhida apenas por familiaridade
trando e muitas vezes persistindo e convenincia. O que no ser um problema, j que os
contedo. Um dos mais poderosos web princpios gerais para qualquer linguagem estaro pre-
crawlers conhecidos o googlebot, o sentes.
crawler web da Google, ele respon-
svel por vasculhar a web, procurando O problema da informao
por novas pginas para indexar e ana- Para entendermos o porqu da prtica do cra-
lisar se as pginas j existentes foram wling, precisamos falar um pouco sobre o desenvol-
devidamente atualizadas. vimento da internet. No iremos abordar a questo
Um Web crawler, que tambm co- de forma tcnica, pois o que importante no tan-
nhecido como web spider ou web robot,
to o como, mas sim o quanto.
e um agente de software utilizado para
De acordo com a consultoria Jess3, o nmero de
automatizar pesquisa, captura e extrao
usurios da rede em 1995 j era pouca coisa maior
de dados. Trafegados geralmente em protocolos HTTP
junto com o modelo TCP/IP, a maioria dos robots de- que 45 milhes de pessoas e, de acordo com a mesma
senvolvidos so voltados para a web tradicional onde consultoria, o nmero em setembro de 2009 j era de
documentos html conectados por hyperlinks, tags e pa- 1,73 bilhes de pessoas. De qualquer ponto de vista
lavras chave so usados para rastrear e atender neces- esse um nmero impressionante, mas que no diz
sidades especficas como: down- muita coisa sozinho. No entanto, se juntarmos a ele
load de imagens e o nmero de informao disponvel atravs da web
arquivos, va- teremos um problema real.
lidao Uma pesquisa realizada pela University of Sou-
auto- thern California intitulada The Worlds Technolo-
gical Capacity to Store, Communicate, and Compute
Information, chegou a concluso que, em 2002, a
/ 42
Rodrigo Ribeiro | rdccr05@gmail.com
Atua h nove anos com anlise e desenvolvimento de sistemas. Bacharel em Sistemas de Informao e Especialista em Desenvolvi-
mento de Sistemas Web pelo IESAM. Possui certificaes internacionais SCJP e OCWCD. Atualmente trabalha como consultor Java
e PHP na Discover Technology.
43 \
HTTP. verdade, ento, que se pode trabalhar em Servio e custos esto mais ligados tica. Craw-
cima de SMTP, FTP, entre outros. lers podem afetar a qualidade de repostas dos servi-
Atravs do protocolo escolhido o agente faz, en- dores ao fazerem vrias requisies em um curto es-
to, uma requisio fonte de dados, que acaba por pao de tempo. Isso afeta, ou pode afetar, a qualidade
retornar o contedo desejado, que ser trabalhado do servio prestado aos consumidores finais, os usu-
para a extrao das informaes. O protocolo utiliza- rios, deixando-os mais lentos. Eles podem aumentar
do neste artigo ser explicado de forma mais tcnica tambm o consumo de banda, o que pode gerar cus-
mais adiante. tos extras aos proprietrios de pginas.
A privacidade talvez a questo mais difcil de
Extrao atravs de Expresses Regulares se definir. Normalmente o que est disponvel na in-
H vrias formas de se extrair dados de um docu- ternet pblico. Qual a diferena entre acessar uma
mento. No entanto, ao lidar com contedo dinmi- pgina atravs do navegador ou atravs de um pro-
co provvel que aplicar expresses regulares seja a grama que varre seu contedo? Aqui, talvez, o maior
melhor forma. problema o que se faz depois com a informao
Expresses regulares so padres que lhe permi- obtida. A prtica de spam talvez exemplifique bem
tem localizar de forma flexvel alguma sequncia de esse problema. E-mails podem ser buscados atravs
caracteres. Isso significa que, com um mesmo padro, de crawlers especficos para a funo e depois usados
possvel voc localizar uma sequncia de caracteres em listas de malas diretas.
especfica em qualquer lugar de um documento. J o copyright o maior suporte legal regula-
Por exemplo, possvel localizar qualquer ocor- mentao do web crawling. Uma prtica comum aos
rncia da sequncia car dentro de um documento crawlers a cpia e armazenamento de contedo com
independentemente de fazer parte das palavras car- direitos reservados sem a permisso do proprietrio.
ro, carreta, corretor ou mesmo sozinha car. Para aqueles que querem evitar o mximo de pro-
Desse modo possvel resgatar qualquer dado que blemas legais e morais, uma recomendao seguir
seja necessrio e process-lo conforme suas necessi- as determinaes do arquivo robots.txt. Esse proto-
dades. Outro exemplo, mais prtico, a validao de colo usado largamente desde 1994 impe algumas
data, vejamos abaixo: regras para o clawling so seu domnio, determinando
o que pode ou no ser acessado. Por exemplo:
Listagem 1. Expresso regular usada para validao
User-agent *
de data.
Disallow /teste/
^([1-9]|0[1-9]|[1,2][0-9]|3[0,1])/([1-9]|1[0,1,2])/\d{4}$
Nesse caso no ser permitido fazer a leitura do
Esse padro valida qualquer data no formato contedo do diretrio teste, e qualquer um de seus
99/99/9999, desse modo possvel confirmar se subdiretrios.
algum campo de data foi digitado corretamente, ou No entanto bom lembrar que a leitura e obedi-
se existe alguma data no contedo de um documento. ncia aos parmetros desse arquivo no obrigatria,
A correta aplicao das expresses regulares ser apenas uma boa prtica para aqueles que desenvol-
determinante na eficincia de um Crawler, tanto em vem crawlers.
sua abrangncia quanto no retorno do contedo pro-
curado. Programando um Web Crawler
O HTTP (Hyper-Text Transfer Protocol) talvez
Questes Legais o protocolo mais importante usado na World Wide
As questes de legalidade da prtica do web cra- Web. Navegadores de internet, Web Services e o cres-
wling so, ainda, obscuras. E aqui deve ficar claro o cimento da computao em rede continua a expandir
que foi dito, isso vale principalmente para o contedo o papel do HTTP, e com isso o aumento do nmero
proveniente da Web. J que pode existir um crawler de aplicaes que necessitem de suporte a este pro-
varrendo a intranet de uma empresa, o que mantm tocolo. A web um campo bastante interessante para
os assuntos referentes ao acesso ao contedo, nesse pesquisas de minerao de dados, devido a grande
caso, restrito a uma esfera no pblica. quantidade de informao disponvel na internet.
Nas questes do contedo proveniente da inter- Uma tcnica bastante conhecida o Data Mining,
net, a legislao prpria de cada pas, o que aumen- que consiste no processo de descobrir informaes
ta muito as variantes. De qualquer forma possvel relevantes, como padres, associaes, mudanas
dividir essas questes em ticas e de lei positivada. e estruturas, em grandes quantidades de dados ar-
Nessa diviso possvel encontrar, pelo menos, mazenados em repositrios de informao. Fazendo
quatro questes importantes: servio, custo, privaci- uma converso para o contexto do artigo, a tcnica
dade e copyright. utilizada seria o Web Mining, que pode se entender
/ 44
como uma extenso de Data Mining aplicado a dados HttpComponents da Apache
da internet. O HttpComponents da Apache proporciona um
robusto suporte para protocolos HTTP, possui com-
O que Web Mining? ponentes com poder para construir aplicativos clien-
Web Mining envolve tcnicas de recuperao de te e servidor, como navegadores web, web crawlers,
Informao, estatstica, inteligncia articial e mine- proxies HTTP, comunicao distribuda etc. Entre os
rao de dados. uma maneira usada para descobrir componentes destacam-se o HttpCore, que atua no
e extrair automaticamente dados de servios e docu- baixo nvel de transporte HTTP e que pode ser usado
mentos disponveis na internet, em geral, as princi- para construir cliente personalizado, servios do lado
pais tarefas de web mining so: do servidor e suporte a modelo de I/O. HttpClient,
Busca de Documentos: a tcnica usada nessa um agente com base no httpcore, compatvel com
tarefa a de Recuperao de Informao que aplicaes HTTP fornece componentes reutilizveis
consiste no processo de extrair dados a partir para a autenticao do cliente, manter estado e ge-
de sites web se valendo do contedo de docu- renciamento de conexes, consumo de contedo
mentos HTML, navegando entre palavras cha- html etc.
ves e tags eliminando-as e recuperando os tex-
tos contidos nessas estruturas. O Web Crawler
Seleo e pr-processamento: o pr-processa- Nesta fase do artigo, iremos desenrolar o desen-
mento envolve qualquer tipo de transforma- volvimento do web crawler, a tarefa de web mining
o da informao obtida na busca, como, por do nosso exemplo ser do tipo busca de documentos
exemplo, corte de textos. e ser utilizado o componente HttpClient da Apache
Generalizao: com a utilizao de tcnicas de com o recurso para consumo de pginas html, Ex-
inteligncia artificial e minerao de dados, presses Regulares para a recuperao especfica da
possui a tarefa de descobrir de forma autom- informao e criaremos um websevice com JAX-RS
tica padres de um ou entre vrios sites web. para disponibilizar os dados recuperados pelo agen-
Anlise: a anlise aplicada geralmente em to- te de software. Sero extradas algumas informaes
das as tarefas que consiste em validar e inter-livres de usurios do github.com. O agente ser res-
pretar os padres minerados. ponsvel por capturar o avatar, lista de repositrios,
os links para comandos git clone de projetos e a url
Protocolo HTTP + JAVA para download dos arquivos ZIP do repositrio inde-
Originalmente, o Java vem com bibliotecas para xado.
trabalhar e manipular dados trafegados no protocolo
http. Seguindo as especificaes w3c para protocolos Mo na massa: Fase 1
HTTP possvel voc criar seu prprio servidor sem a A primeira fase para a criao de um web crawler
necessidade de APIs externas. Geralmente para esse se d pela avaliao do contedo a ser extrado pelo
tipo de tarefa utiliza-se as classes URL, HTTPUrlCon- agente. Nosso primeiro passo ento analisar a pgi-
nection e Socket do pacote java.net. Pensando pelo na principal do GitHub para extrair somente os links
lado acadmico interessante aprender como se do menu de navegao. Vamos avaliar a seguinte url:
criar um servidor http, criando suas prprias classes https://github.com/.
HttpClient, conectando via sockets etc. Mas quando
o tema produtividade citado, buscar alternativas Listagem 2. Expresso regular usada para extrair
maduras no mercado a melhor opo. Atualmente contedo da home do github.
existem frameworks robustos que facilitam a intera-
<[^>]*?class=\(?:explore|search|features|blog)
o e manipulao de dados trafegados na web.
[^>]*?\><a[^>]href=\(.*?)>(.*?)</a></[^>]*?>
Figura 2. Pgina principal do GitHub com expresso regular de extrao sendo executada no site http://regexpal.com/.
45 \
Agora o prximo passo criar a regex para extrair contedo Mo na massa: Fase 2
especfico da pgina de usurios do github. Vamos avaliar a
Agora com as expresses regulares devidamente
prxima url: https://github.com/rdccr e extrair o avatar e o
criadas vamos comear a desenvolver programatica-
link para os repositrios. Veja figura 3.
mente o web crawler. Na fase 2 iremos criar os beans
Listagem 3. Expresses regulares usadas para extrair que iro mapear os resultados capturados e o motor
o avatar e a url de repositrios do usurio github. de busca do crawler. Seguem abaixo os fragmentos de
cdigo com a estrutura dos beans.
AVATARED: <div\\sclass=\avatared\>[^>]*?<a\\
shref=\(.*?)\ Listagem 5. Fragmentos de cdigo com a estrutura
REPOSITORIES_TAB: [^<a\\shref=\].*?\\?tab=repositories dos beans.
/ 46
final String DOMAIN = https://github.com;
private List<GitHubRepository> repositories;
private List<GitHubCloneUrl> cloneUrls; // Clausula para executar de pesquisa padrao.
private String urlAvatared; GitHub search(HttpClient httpclient, HttpGet httpget,
private String urlTabRepositories; ResponseHandler<String> responseHandler);
// Getters e Setters
} // Clausula para buscar foto de usuario github.
/*Constantes regex para parseamento do github. */ String findUrlAvatared(HttpClient httpclient, HttpGet
public final class GitHubPattern { httpget, ResponseHandler<String>
// Expressao usada para recuperar pagina de repositorios. responseHandler);
public static final String REPOSITORIES_TAB =
[^<a\\shref=\].*?\\?tab=repositories; // Clausula para buscar url parent da busca de
// Expressao usada para recuperar foto do usuario. repositorios
public static final String AVATARED = String findUrlTabRepositories(HttpClient httpclient,
<div\\sclass=\avatared\>[^>]*?<a\\shref=\(.*?)\; HttpGet httpget, ResponseHandler<String>
// Expressao usada para recuperar lista de repositorios. responseHandler);
public static final String REPOSITORIES_LIST =
<h3>[^>]*?<span[^>]*?>.*?</span>[^>]*? // Clausula para buscar url de arquivo ZIP de
<a\\shref=\(.*?)\>(.*?)</a>[^>]*?</h3>; repositorio.
// Expressao usada para recuperar arquivo zip para String downloadZipFile(HttpClient httpclient, HttpGet
download. httpget, ResponseHandler<String>
public static final String DOWNLOAD_ZIP = responseHandler);
<a\\shref=\(.*?)\[^>]*?><span[^>]*?></span>
ZIP</a>; // Clausula para buscar links para comandos git clone.
// Expressao usada para recuperar links para o List<GitHubCloneUrl> findCloneUrls(HttpClient
comando git clone. httpclient, HttpGet httpget,ResponseHandler
public static final String CLONE_URL = <String> responseHandler);
<[^>]*?\\sclass=\(?:http_clone_url|public_clone_
url|private_clone_url)[^>]*?\>[^>]*?<a\\ // Clausula para buscar links da pagina principal do
shref=\(.*?)\[^>]*?>(.*?)</a></[^>]*?>; github.
// Expressao usada para recuperar menu principal da List<GitHubHome> findMenuGitHubHome(HttpClient
home do github. httpclient, HttpGet httpget,
public static final String GITHUB_HOME = ResponseHandler<String> responseHandler);
<[^>]*?class=\(?:explore|search|features|blog) }
[^>]*?\><a[^>]href=\(.*?)>(.*?)</a></[^>]*?>;
// Expressao usada para recuperar erro caso usuario
A interface descrita acima representa a estrutura do
submetido nao exista agente e os mtodos que sero implementados pos-
suem os seguintes argumentos: HttpClient respons-
} vel por trafegar no protocolo http, HttpGet respons-
vel por consumir via get a url que ser utilizada pelo
cliente http e o ResponseHandler<String> respons-
vel pela resposta do contedo html acessado. A mani-
O prximo fragmento de cdigo ser referente ao da
pulao desses objetos a base para o funcionamen-
interface IGitHubSearchEngine que foi criada para
to do web crawler desenvolvido.
conter o contrato com as implementaes das assi-
naturas search(), findUrlAvatared(), findUrlTabRepo- Listagem 7. Implementao do mtodo findMenuGi-
sitories(), downloadZipFile(), findCloneUrls(), find- tHubHome().
MenuGitHubHome() que o motor de busca do crawler // WebSpider GitHubSearchEngine.
dever seguir para seu funcionamento. Segue abaixo: public final class GitHubSearchEngine implements
IGitHubSearchEngine {
Listagem 6. Contratos que devem ser seguidos pelo
Crawler. // Referencias para motor de busca
public interface IGitHubSearchEngine { private ICompileRegex regex;
// Constant com o dominio github. private Matcher matcher;
47 \
return this.listGitHubHome;
//Variaveis de instancia }
private String urlTabRepositories; // Outros mdotos...
private String urlAvatared; }
private String urlDownloadZipFile;
private List<GitHubRepository> listGitHubRepository; Analisando o cdigo da Listagem 3, podemos verificar
private List<GitHubCloneUrl> listGitHubCloneUrl; que a lgica de busca proposta funciona da seguinte
private final GitHub gitHub; forma. Em uma classe criada para encapsular as ta-
private List<GitHubHome> listGitHubHome; refas de compilao da expresso regular, passado
como parmetro o padro a ser usado referenciado
// Construtor com argumento pela constante GitHubPattern.GITHUB_HOME e a
public GitHubSearchEngine(ICompileRegex regex) { resposta da execuo do client http representado por
this.regex = regex; httpclient.execute(httpget, responseHandler). O re-
this.gitHub = new GitHub(); sultado desse casamento de dados ser passado para
} um objeto matcher e, caso this.matcher.find() seja
// outros mtodos... verdadeiro, significa que a expresso regular obte-
ve retorno, sero adicionadas novas informaes ao
/** objeto GitHubHome. Note que no finally fechamos a
* Metodo utilizado para recuperar lista de links da conexo do HttpClient.
home do github.
*/
Mo na massa: Fase 3
public List<GitHubHome> findMenuGitHubHome(
Nesta ltima fase vamos criar um webservice
HttpClient httpclient, HttpGet httpget,
para disponibilizar acesso s aes do web crawler,
ResponseHandler<String> responseHandler) {
try {
podendo assim as informaes serem consumidas e,
// Cria referencia para lista de objetos
caso seja necessrio, persistidas em algum modelo
GitHubHome. de dados. Para a criao do webservice rest ser uti-
this.listGitHubHome = lizado o JAX-RS com Jersey para gerar um retorno no
new ArrayList<GitHubHome>(); formato json. Segue trecho do cdigo:
// Executa regex na resposta do httpclient.
Listagem 8. Web service para disponibilizar as infor-
this.matcher = regex.execute(
maes.
GitHubPattern.GITHUB_HOME, httpclient.
execute(httpget, responseHandler)); @Path(/github)
/* public final class GitHubService {
* Percorre casamento do padrao, cria uma
* referencia de GitHubHome, /**
* populando e adicionando lista listGitHubCloneUrl * Metodo do servico que retorna links da pagina
*/ principal do github.com
while (this.matcher.find()) { * ACESSAR DA SEGUINTE FORMA: http://
localhost:8080/crawler/service/github/
// Cria referencia do Bean de menu da home.
*/
GitHubHome gitHubHome =
@GET
new GitHubHome(); @Produces(MediaType.APPLICATION_JSON)
// Seta Valores para a referencia do bean. public Map<String, List<GitHubHome>>
gitHubHome.setUrl(this.matcher.group(1)); findMenuHome() {
gitHubHome.setTitle(this.matcher.group(2));
// Adiciona a referencia atual a lista de itens // Dominio do github.
// de menu. String gitHubHomeDomain =
this.listGitHubHome.add(gitHubHome); IGitHubSearchEngine.DOMAIN;
}
} catch (ClientProtocolException e) { // Cria referencia para map de objetos GitHubHome.
e.printStackTrace(); Map<String, List<GitHubHome>> menuHome =
new HashMap<String, List<GitHubHome>>();
} catch (IOException e) { // Cria referencia para GitHubSearchEngine.
e.printStackTrace(); IGitHubSearchEngine gitHub =
} finally { new GitHubSearchEngine(new CompileRegex());
// Fecha a conexao de httpclient.
httpclient.getConnectionManager().shutdown(); /*
}
/ 48
thub/para extrair os itens do menu principal da home
* Cria referencia listGitHubHome para
do site github, ou http://localhost:8080/Spider/ser-
lista de objetos GitHubHome com o
* retorno de
vice/github/seu-usuariopara extrair sua foto, lista de
gitHub.findMenuGitHubHome(). repositories e arquivos para download. Veja figuras 5
*/ e 6.
List<GitHubHome> listGitHubHome =
gitHub.findMenuGitHubHome( Consideraes finais
new DefaultHttpClient(), O propsito deste artigo foi mostrar o porqu da
new HttpGet(gitHubHomeDomain),
prtica do web crawling e sua importncia no contex-
new BasicResponseHandler());
to da web atual, levando em considerao seu tama-
// Adiciona valor ao map. nho e necessidade do consumo de seu contedo.
menuHome.put(gitHubHomeDomain, Vimos tambm os conceitos bsicos de qualquer
listGitHubHome); crawler, independentemente de linguagem e tecno-
logia. Aproveitamos e exemplificamos de forma pr-
return menuHome; tica a implementao em Java de um agente espec-
} fico, que faz a captura e filtragem de dados, livres, do
}
github.com.
Esperamos que assim o leitor tenha a base para
Para acessar os servios localmente digite no seu iniciar uma implementao de um crawler em qual-
navegador: http://localhost:8080/Spider/service/gi- quer linguagem.
/referncias
> Mastering Regular Expressions (Jeffrey Friedl).
> http://www.dct.ufms.br/~mzanusso/Data_Mining.htm
> http://hc.apache.org/
> http://regexpal.com/
> http://news.usc.edu/#!/article/29360/How-Much-
Information-Is-There-in-the-World
> http://www.sciencemag.org/content/332/6025/60
> http://jess3.com
> http://en.wikipedia.org/wiki/Web_scraping#Legal_issues
> http://carl.cs.indiana.edu/fil/WebSec/mining_social_
networks.html
49 \