¿Cómo puedo descargar objetivos de enlaces desde un sitio web usando Perl?
download www-mechanize (4)
Acabo de crear un script para tomar enlaces de un sitio web y, a su vez, los guardo en un archivo de texto.
Ahora estoy trabajando en mis expresiones regulares para que capture enlaces que contengan php?dl=
en la url del archivo de texto:
Ejemplo: www.example.com/site/admin/a_files.php?dl=33931
Es más o menos la dirección que obtienes cuando pasas el botón dl
en el sitio. Desde el cual puede hacer clic para descargar o "hacer clic con el botón secundario en guardar".
Me pregunto cómo lograr esto, teniendo que descargar el contenido de la dirección dada que descargará un archivo *.txt
. Todo desde el guión, por supuesto.
Make WWW::Mechanize
your new best friend.
Este es el por qué:
- Puede identificar enlaces en una página web que coincida con una expresión regular específica (
/php/?dl=/
en este caso) - Puede seguir esos enlaces a través del método
follow_link
- Puede
get
los objetivos de esos enlaces y guardarlos en un archivo
¡Todo esto sin necesidad de guardar tus enlaces deseados en un archivo intermedio! La vida es dulce cuando tienes la herramienta adecuada para el trabajo ...
Ejemplo
use strict;
use warnings;
use WWW::Mechanize;
my $url = ''http://www.example.com/'';
my $mech = WWW::Mechanize->new();
$mech->get ( $url );
my @linksOfInterest = $mech->find_all_links ( text_regex => qr/php/?dl=/ );
my $fileNumber++;
foreach my $link (@linksOfInterest) {
$mech->get ( $link, '':contentfile'' => "file".($fileNumber++).".txt" );
$mech->back();
}
Puede descargar el archivo con LWP :: UserAgent :
my $ua = LWP::UserAgent->new();
my $response = $ua->get($url, '':content_file'' => ''file.txt'');
O si necesita un identificador de archivo:
open my $fh, ''<'', $response->content_ref or die $!;
Una vieja pregunta, pero cuando estoy haciendo scripts rápidos, a menudo uso "wget" o "curl" y pipe. Esto no es portátil a través del sistema, tal vez, pero si sé que mi sistema tiene uno u otro de estos comandos, generalmente es bueno.
Por ejemplo:
#! /usr/bin/env perl
use strict;
open my $fp, "curl http://www.example.com/ |";
while (<$fp>) {
print;
}