Me gustaría extraer enlaces de una secuencia numérica de páginas como esta:
http://ejemplo.com/page001.html
http://ejemplo.com/page002.html
http://ejemplo.com/page003.html
...
http://ejemplo.com/page329.html
Lo que quiero como resultado es un archivo de texto con las URL recopiladas de los enlaces de estas páginas:
http://www.test.com/index.html
http://www.google.com
http://www.superuser.com/questions
Para ser claro, no quiero descargar las páginas, solo quiero una lista de enlaces.
El software de Windows sería una idea, pero Linux también estaría bien. Lo único que se me ocurre es escribir un script por lotes largo con Xidel, pero no sería muy sólido si encontrara errores. Curl puede descargar el rango de páginas, pero luego necesito analizarlas de alguna manera.
Gracias a Enigman por ponerme en el camino correcto. Creé un script en Perl que lee las URL de un archivo y genera enlaces que coinciden con una cadena almacenada en $site:
use warnings;
use LWP;
$site = "twitter.com";
my $browser = LWP::UserAgent->new;
my @ns_headers = (
'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36',
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language' => 'en-GB,en;q=0.8',
);
open (URLLIST, 'urls.txt');
while (<URLLIST>) {
chomp;
print "# $_\n";
my $response = $browser->get($_, @ns_headers);
die "Can't get $_ -- ", $response->status_line
unless $response->is_success;
my @urls = $response->content =~ /\shref="?([^\s>"]+)/gi ;
foreach $url(@urls) {
if ($url =~ /$site/) {
print("$url\n");
}
}
}
close(URLLIST);
Para generar la lista de URL, hice un pequeño script por lotes:
@echo off
for /l %%i in (0, 15, 75) do @echo http://www.example.com/page_%%i.html
El script Perl simplemente se detiene ante un error, lo cual prefiero. Sería trivial modificarlo para continuar. El agente de usuario y los datos de aceptación se extraen de Chrome, porque a algunos sitios no les gusta nada que parezca un bot. Si tiene la intención de escanear sitios que no son de su propiedad, respete el archivo robots.txt y configure un agente de usuario personalizado.
Respuesta1
Si desea utilizar código para hacer esto, puede hacerlo en Perl usando los módulos LWP::Simple o Mechanize.
Lo siguiente podría tener lo que buscasEncuentre todos los enlaces de una página web usando el módulo LWP::Simple
Esto supone que se siente cómodo utilizando una solución de línea de comandos utilizando Perl. Esto funciona igual en las plataformas Windows y Linux. No sería necesario modificar mucho para tomar las URL como parámetros de la línea de comando para analizar.
Respuesta2
Sí, es un buen script bash. Esto utiliza el navegador Lynx para extraer las URL de las páginas y volcarlas en un archivo de texto:
#!/bin/bash
#
# Usage:
#
# linkextract <start> <end> <pad> <url>
#
# <start> is the first number in the filename range. Must be an integer
# <stop> is the last number in the filename range. Must be an integer
# <pad> is the number of digits the number in the filename is zero-padded to.
# <url> is the URL. Insert "<num>" where you want the number to appear. You'll
# need to enclose the entire argument in quotes
for (( i=${1} ; i<=${2} ; i++ )); do {
num=$(printf "%04d" ${i})
url=$(echo ${4} | sed "s/<num>/${num}/")
lynx -dump -listonly "${url}" | sed -r -n "/^ +[0-9]/s/^ +[0-9]+\. //p"
}; done
Necesitará instalar el navegador lynx, que está disponible en Debian como el paquete 'lynx'. El script imprime las URL extraídas en la salida estándar. Entonces, para el ejemplo de su pregunta, haría (suponiendo que guarde el script en un archivo llamado linkextract):
$ linkextract 1 329 3 "http://example.com/page<num>.html"
Respuesta3
Puedes usar elRastreador del visualizador de sitiospara este trabajo. Descárguelo e instálelo, luego haga clicNuevo proyecto, escriba la URL de su sitio web, haga clic en Aceptar y luegoIniciar rastreobotón de herramienta.
Una vez completado el rastreo, haga doble clicTodos los enlacesinforme de laInformespestaña. Se le proporcionarán todos los enlaces que están presentes en el sitio web, así como otra información: URL de enlace de origen/destino, tipo de contenido (HTML, imagen, pdf, css, etc.), respuesta, etc. Seleccione toda la tabla (menú contextual o Ctrl+A), luego haga clic enCopiar filas con encabezadoselemento del menú contextual. Después de eso, puedes pegar los datos en una hoja de Excel o en un documento de texto simple:
El programa tiene un período de prueba de 30 días, pero tiene todas las funciones, por lo que puedes usarlo gratis durante 1 mes.