lunes, 9 de septiembre de 2013

Conexiones http avanzadas con el módulo Mechanize de Perl

 
Mechanize es el módulo más completo de Perl para interactuar vía http con websites, este módulo tiene múltiples funciones, desde enviar formularios vía get y post, a la posibilidad de establecer parámetros de búsqueda dentro del cuerpo html de la web solicitada y de este modo obtener información como cabeceras, links, imágenes, formularios, etc ..., el problema es que mechanize no viene instalado en Perl por defecto, por lo tanto hay que hacerlo a través de CPAN ...


cpan> install WWW::Mechanize


La instalación puede tardar unos cinco minutos, pero merece la pena, ya que como podrás ver en los siguientes ejemplos se le puede sacar mucho partido, también puedes investigar un poco más sobre este módulo en el siguiente link ...

 http://search.cpan.org/~ether/WWW-Mechanize-1.73/lib/WWW/Mechanize.pm

En el primer ejemplo se muestra como enviar un formulario con sus respectivos campos y valores y mostrar por la consola la respuesta del servidor ...

mechanize-form.pl

#mechanize-form.pl
#Enviar formulario con Mechanize
use WWW::Mechanize;
use strict;

my $url = "http://www.web.com/index.php";

#Crear un nuevo objeto mechanize
my $mechanize = WWW::Mechanize->new();

#Url de destino
$mechanize -> get($url);

#Se preparan los datos a enviar en el formulario
$mechanize -> submit_form(
#Además de form_id, puedes utilizar form_number y form_name
form_id => "form_sesion", 
#Rellena cada uno de los campos del formulario con su respectivo valor ...
fields => {admin => "admin", password => "password"}
);

#Almacenamos en esta variable el contenido devuelto por la petición
my $contenido = $mechanize -> content();

#Se imprime el contenido
print $contenido;


Este otro ejemplo extrae la url tanto de imágenes como de links, simplemente hay que indicar la url, la opción que se desea images o links y opcionalmente si se quiere guardar el resultado en un fichero.

mechanize-find.pl

#mechanize-find.pl
#Buscar la url de imágenes y links con Mechanize
#opción de guardar los resultado en un fichero
use WWW::Mechanize;
use strict;

#parametros
my $url = $ARGV[0];
my $tipo = $ARGV[1];
my $fichero = $ARGV[2];

if (!@ARGV || $tipo != "images" || $tipo != "links")
{
print "\n\n Introduce correctamente los datos ... mechanize-find.pl http://www.web.com/ images|links opcional[fichero txt] \n\n";
}
else
{
#Crear un nuevo objeto mechanize
my $mechanize = WWW::Mechanize->new();

#Url de destino
$mechanize -> get($url);

#Se busca el tipo que puede ser imágenes o links
my @elementos = $mechanize -> $tipo;

my $elemento;
my $resultado;

for $elemento (@elementos)
{
#Se recorre cada uno de los elementos y se almacenan en una variable
$resultado .= $elemento->url . "\n";
}

#Si se indica un fichero se crea el fichero y se guarda el resultado
if ($fichero)
{
open(ARCHIVO, "+> $fichero");
print ARCHIVO $resultado;
close(ARCHIVO);
}

#Se imprime el resultado en la consola
print $resultado;
}