#!/usr/bin/perl
use common::sense;
use autodie;
## Creación del entorno
my @URL;
for (1 .. 30) {
push @URL, "http://sitio.com/archivo$_.txt";
}
my @PROXY;
for (1 .. 10) {
push @PROXY, "proxy:$_";
}
## Simulación
my @proxy;
my $p;
while (@URL) { # Mientras tengamos URL que bajar
while (my($i, $url) = each @URL) { # Por cada URL
next if not $url; # Saltamos los URL vacíos
if (not @proxy) {
say "Renovamos lista de proxies";
@proxy = @PROXY; # Recargamos la batería de proxies a usar
$p = 0;
}
else { # Buscamos el siguiente proxy más prometedor
do {
$p = ++$p % @proxy; # Apuntamos al siguiente proxy...
} until ($proxy[$p]); # ... hasta que encontramos uno
}
for my $intentos ( 1 .. @proxy ) { # Lo intentamos tantas veces como proxies
printf "[%2d/%2d] ", $intentos, scalar @proxy;
if (not $proxy[$p]) {
$p = ++$p % @proxy; # Apuntamos al siguiente proxy
print "...\n";
next; # y reintentamos
}
my $respuesta = pide($url, $proxy[$p]);
if ($respuesta == 200) { # Conseguido
delete $URL[$i]; # quitamos la URL
last; # y probamos con la siguiente
}
else { # Hubo un fallo
delete $proxy[$p]; # quitamos proxy defectuoso
last if not @proxy; # salimos si no nos quedan más
$p = ++$p % @proxy; # Pasamos al siguiente proxy
}
}
# die "ERROR: no ha bajado $url con todos los proxies";
}
}
# simula una petición
sub pide {
my($url, $proxy) = @_;
# sleep 1;
my $respuesta = ( 6 > rand 10 ) ? 200 : 500; # simulamos respuesta
print "$url\t[$respuesta] $proxy\n";
return $respuesta;
}
__END__
Renovamos lista de proxies
[ 1/10] http://sitio.com/archivo1.txt [200] proxy:1
[ 1/10] http://sitio.com/archivo2.txt [200] proxy:2
[ 1/10] http://sitio.com/archivo3.txt [500] proxy:3
[ 2/10] http://sitio.com/archivo3.txt [200] proxy:4
[ 1/10] http://sitio.com/archivo4.txt [500] proxy:5
[ 2/10] http://sitio.com/archivo4.txt [200] proxy:6
[ 1/10] http://sitio.com/archivo5.txt [200] proxy:7
[ 1/10] http://sitio.com/archivo6.txt [200] proxy:8
[ 1/10] http://sitio.com/archivo7.txt [200] proxy:9
[ 1/10] http://sitio.com/archivo8.txt [500] proxy:10
[ 2/ 9] http://sitio.com/archivo8.txt [200] proxy:2
[ 1/ 9] http://sitio.com/archivo9.txt [200] proxy:4
[ 1/ 9] http://sitio.com/archivo10.txt [200] proxy:6
[ 1/ 9] http://sitio.com/archivo11.txt [500] proxy:7
[ 2/ 9] http://sitio.com/archivo11.txt [200] proxy:8
[ 1/ 9] http://sitio.com/archivo12.txt [500] proxy:9
[ 2/ 8] http://sitio.com/archivo12.txt [500] proxy:2
[ 3/ 8] ...
[ 4/ 8] http://sitio.com/archivo12.txt [200] proxy:4
[ 1/ 8] http://sitio.com/archivo13.txt [200] proxy:6
[ 1/ 8] http://sitio.com/archivo14.txt [500] proxy:8
[ 2/ 6] ...
[ 3/ 6] http://sitio.com/archivo14.txt [200] proxy:4
[ 1/ 6] http://sitio.com/archivo15.txt [200] proxy:6
[ 1/ 6] http://sitio.com/archivo16.txt [500] proxy:1
[ 2/ 6] ...
[ 3/ 6] ...
[ 4/ 6] http://sitio.com/archivo16.txt [500] proxy:4
[ 5/ 6] ...
[ 6/ 6] http://sitio.com/archivo16.txt [200] proxy:6
[ 1/ 6] http://sitio.com/archivo17.txt [500] proxy:6
Renovamos lista de proxies
[ 1/10] http://sitio.com/archivo18.txt [200] proxy:1
[ 1/10] http://sitio.com/archivo19.txt [200] proxy:2
[ 1/10] http://sitio.com/archivo20.txt [200] proxy:3
[ 1/10] http://sitio.com/archivo21.txt [500] proxy:4
[ 2/10] http://sitio.com/archivo21.txt [200] proxy:5
[ 1/10] http://sitio.com/archivo22.txt [200] proxy:6
[ 1/10] http://sitio.com/archivo23.txt [500] proxy:7
[ 2/10] http://sitio.com/archivo23.txt [200] proxy:8
[ 1/10] http://sitio.com/archivo24.txt [500] proxy:9
[ 2/10] http://sitio.com/archivo24.txt [200] proxy:10
[ 1/10] http://sitio.com/archivo25.txt [500] proxy:1
[ 2/10] http://sitio.com/archivo25.txt [500] proxy:2
[ 3/10] http://sitio.com/archivo25.txt [200] proxy:3
[ 1/10] http://sitio.com/archivo26.txt [200] proxy:5
[ 1/10] http://sitio.com/archivo27.txt [200] proxy:6
[ 1/10] http://sitio.com/archivo28.txt [200] proxy:8
[ 1/10] http://sitio.com/archivo29.txt [200] proxy:10
[ 1/10] http://sitio.com/archivo30.txt [200] proxy:3
[ 1/10] http://sitio.com/archivo17.txt [500] proxy:5
[ 2/10] http://sitio.com/archivo17.txt [500] proxy:6
[ 3/10] ...
[ 4/10] http://sitio.com/archivo17.txt [500] proxy:8
[ 5/10] ...
[ 6/10] http://sitio.com/archivo17.txt [500] proxy:10
[ 7/ 3] ...
[ 8/ 3] http://sitio.com/archivo17.txt [500] proxy:3
Renovamos lista de proxies
[ 1/10] http://sitio.com/archivo17.txt [500] proxy:1
[ 2/10] http://sitio.com/archivo17.txt [500] proxy:2
[ 3/10] http://sitio.com/archivo17.txt [500] proxy:3
[ 4/10] http://sitio.com/archivo17.txt [200] proxy:4