Daniel de Oliveira MantovaniPublicado em 01/03/2011
Perl oferece uma quantidade robusta de código reutilizável(Módulos) para você automatizar a sua navegação web, criando robôs, web crawlers ou qualquer coisa que a sua imaginação possa pensar.
A linguagem Perl tem o maior repositório do mundo de código reutilizável, CPAN além do código ter uma excelente documentação, os códigos tem uma camada de teste que garante as funcionalidades funcionarem no seu ambiente.
Nesse artigo utilizarei o Mechanize, esse módulo oferece os recursos necessários para uma navegação automatizada.
A maioria dos Unix-likes têm por padrão o Perl instalado, e consequentemente o CPAN, para instalar um módulo Perl, você apenas precisa digitar:
$cpan WWW::Mechanize
Se você tiver alguma dúvida de como instalar algum módulo Perl esse artigo irá te iluminar, http://blog.blabos.org/2011/01/perl-cada-vez-mais-facil/.
Vou listar os recursos que o Mechanize oferece,
All HTTP methods
High-level hyperlink and HTML form support, without having to parse HTML yourself
SSL support
Automatic cookies
Custom HTTP headers
Automatic handling of redirections
Proxies
HTTP authentication
Nesse artigo eu vou abordar, alguns exemplos do poder que o Mechanize nos oferece. Vamos automatizar uma busca no site da IBM,http://www.ibm.com/search/csass/search, entre no website e você perceberá que existem três campos, um para você digitar a busca, e dois campos tipo "select" que é para você escolher o país e o idioma.
Quando você instala o Mechanize você ganha o comando "mech-dump", que é extremamente útil para obter informações sobre formulários, bem vamos lá.
mantovani@mantovani-laptop:~$ mech-dump http://www.ibm.com/search/csass/search
GET http://www.ibm.com/Search/
q= (text)
v=16 (hidden readonly)
en=utf (hidden readonly)
lang=en (hidden readonly)
cc=us (hidden readonly)
Search=Search (submit)
GET http://www.ibm.com/search/csass/search (multipart/form-data)
q= (text)
co=us (option) [any/Worldwide|dz/Algeria|ai/Anguilla|ag/Antigua and Barbuda|ar/Argentina|aw/Aruba|au/Australia|at/ Austria|bs/Bahamas|bh/Bahrain|bd/Bangladesh|bb/Barbados|be/Belgium|bm/Bermuda|bo/Bolivia|br/Brazil|vg/British Virgin Islands|bg/Bulgaria|ca/Canada|ky/Cayman Islands|cl/Chile|cn/China|co/Colombia|hr/Croatia|cy/Cyprus|cz/Czech Republic|dk/Denmark|dm/Dominica|ec/Ecuador|eg/Egypt|ee/Estonia|fi/Finland|fr/France|de/Germany|gr/Greece|gd/Grenada|gy/Guyana|hk/Hong Kong|hu/Hungary|in/India|id/Indonesia|ie/Ireland|il/Israel|it/Italy|jm/Jamaica|jp/Japan|jo/Jordan|kr/Korea, Republic of|kw/Kuwait|lv/Latvia|lb/Lebanon|lt/Lithuania|my/Malaysia|mx/Mexico|ms/Montserrat|ma/Morocco|nl/Netherlands|an/Netherlands Antilles|nz/New Zealand|no/Norway|om/Oman|pk/Pakistan|py/Paraguay|pe/Peru|ph/Philippines|pl/Poland|pt/Portugal|qa/Qatar|ro/Romania|ru/Russian Federation|kn/Saint Kitts and Nevis|lc/Saint Lucia|vc/Saint Vincent and the Grenadines|sa/Saudi Arabia|rs/Serbia|sg/Singapore|sk/Slovakia|si/Slovenia|za/South Africa|es/Spain|lk/Sri Lanka|sr/Suriname|se/Sweden|ch/Switzerland|tw/Taiwan|th/Thailand|tt/Trinidad and Tobago|tn/Tunisia|tr/Turkey|tc/Turks and Caicos Islands|ua/Ukraine|ae/United Arab Emirates|gb/United Kingdom|*us/United States|uy/Uruguay|ve/Venezuela|vn/Vietnam]
lo=any (option) [*any/All languages|bg/Bulgarian|zh-simplified/Chinese (Simplified)|zh-traditional/Chinese (Traditional)|hr/Croatian|cs/Czech|da/Danish|nl/Dutch|en/English|et/Estonian|fi/Finnish|fr/French|de/German|el/Greek|he/Hebrew|hu/Hungarian|it/Italian|ja/Japanese|ko/Korean|lv/Latvian|lt/Lithuanian|no/Norwegian|pl/Polish|pt/Portuguese|ro/Romanian|ru/Russian|sr/Serbian|sk/Slovak|sl/Slovenian|es/Spanish|sv/Swedish|tr/Turkish|uk/Ukrainian]
ibm-submit= (submit)
sn= (hidden readonly)
lang=en (hidden readonly)
cc=US (hidden readonly)
en=utf (hidden readonly)
hpp= (hidden readonly)
O primeiro formulário é para aquele campo simples de busca do lado direito em cima no site da IBM, e o segundo campo é o campo que queremos que podemos ser mais "precisos" na nossa busca.
O Mechanize oferece um suporte incrível para automatização de formulários, além do comando mágico mech-dump. Agora iremos utilizar o método "submit_form":
use WWW::Mechanize;
my $mech = WWW::Mechanize->new();
$mech->get("http://www.ibm.com/search/csass/search");
$mech->submit_form(
form_number => 2,
fields => {
q => 'O que eu quero buscar',
co => 'br', # país
lo => 'any',# idioma
}
);
print $mech->content;
Pronto, primeiro passamos qual formulário nós queremos, no caso o segundo formulário (2), depois passamos os campos, em "fields". Como o mech-dump mostrou, "q" é para busca, "co" o páis e "lo" para o idioma. Logo após segue um "print", que mostrará o resultado do conteúdo da página após o envio do formulário. Se o site da IBM usasse "https", ao invés "http" não mudaria "nada" para nós pois o Mechanize cuidaria de tudo por baixo dos panos.
Você também pode simular ser um navegador, como FireFox, Internet Explorer entre outros, você apenas precisa modificar o atributo "agent_alias"
$mech->agent_alias( $alias );
Segue uma lista de navegadores que você pode "fingir" ser,
Windows IE 6
Windows Mozilla
Mac Safari
Mac Mozilla
Linux Mozilla
Linux Konqueror
O Mechanize também oferece alguns métodos para você checar o estado da sua requisição, você pode utilizá-los após utilizar o método "get" pelo menos uma vez.
$mech->get(url)...
$mech->success()
Returna uma condição booleana dizendo se a última requisição foi um sucesso ou não.
É equivalente ao método "$mech->res->is_success".
$mech->uri()
Retorna um objeto URI, que contém a URI que você atualmente está.
$mech->response() / $mech->res()
Retorna a atual resposta como um objeto HTTP::Response
Sinimo "$mech->response()"
$mech->status()
Retorna o estado da resposta HTTT. É um digito de 3 números como 200 para OK, 404 para página não encontrada e etc.
$mech->ct() / $mech->content_type()
Retorna o tipo de conteúdo da resposta.
$mech->base()
Retorna a base URI para a resposta atual.
$mech->forms()
Quando chamado no contexto de lista, retorna uma lista com os formulários encontrados da última requisição. No contexto escalar, retorna uma referência de array com esses formulários. Os formulários retornados são um objeto HTML::Form.
$mech->current_form()
Retorna os formulários atuais como um objeto HTML::Form.
$mech->links()
Quando chamados no contexto de lista, retornam a lista de todos os links encontradas na última requisição. No contexto escalar retorna a referência de array com toso os links. Cada link é um objeto WWW::Mechanize::Link.
$mech->is_html()
Retorna verdadeiro/falso de acordo com a resposta HTTP, se verdadeiro o conteúdo é HTML.
$mech->title()
Retorna o título da página atual.
Você pode automatizar navegações web, para diversos usos. Esse artigo foi simplesmente para demonstrar como é simples navegar em páginas usando Perl. O módulo WWW::Mechanize oferece muito mais recursos do que eu descrevi nesse breve artigo, eu recomendo que o leitor leia a documentação com calma.
Daniel de Oliveira Mantovani <daniel.oliveira.mantovani [a] gmail [dot] com>