Cómo encontrar todos los enlaces / páginas de un sitio web

98

¿Es posible encontrar todas las páginas y enlaces en CUALQUIER sitio web? Me gustaría ingresar una URL y producir un árbol de directorio de todos los enlaces de ese sitio.

He mirado HTTrack pero eso descarga todo el sitio y simplemente necesito el árbol de directorios.

Jonathan Lyon
fuente
2
crawlmysite.in - el sitio no existe
Sarah Trees

Respuestas:

70

Echa un vistazo a linkchecker: rastreará el sitio (mientras obedece robots.txt) y generará un informe. Desde allí, puede crear un script para una solución para crear el árbol de directorios.

Hank Gay
fuente
muchas gracias Hank! Perfecto, exactamente lo que necesitaba. Muy apreciado.
Jonathan Lyon
2
Una buena herramienta. Estaba usando "detective de enlaces XENU antes". Linkchecker es mucho más detallado.
Mateng
¿Cómo hago eso yo mismo? y ¿qué pasa si no hay un archivo robots.txt en un sitio web?
Alan Coromano
1
@MariusKavansky ¿Cómo se rastrea manualmente un sitio web? ¿O cómo se construye un rastreador? No estoy seguro de entender tu pregunta. Si no hay ningún robots.txtarchivo, eso solo significa que puede gatear hasta el contenido de su corazón.
Hank Gay
8
hola chicos, linkchecker no me ha funcionado cuando escaneo el sitio, solo devuelve un informe de enlaces rotos. Informe muy pequeño. mientras lo hace, verificaron miles de enlaces, pero no puedo ver dónde se informan. Usando la versión 9.3, ¿puede ayudarme?
JayPex
43

Si tiene la consola de desarrollador (JavaScript) en su navegador, puede escribir este código en:

urls = document.querySelectorAll('a'); for (url in urls) console.log(urls[url].href);

Acortado:

n=$$('a');for(u in n)console.log(n[u].href)
ElectroBit
fuente
1
¿Qué pasa con las URL "editadas con JavaScript"?
Pacerier
¿Como que? ¿Qué quieres decir?
ElectroBit
2
Me refiero a un enlace hecho usando Javascript. Tu solución no lo demostraría.
Pacerier
2
@ElectroBit Me gusta mucho, pero no estoy seguro de lo que estoy viendo. ¿Qué es el $$operador? ¿O es solo un nombre de función arbitrario, al igual n=ABC(''a'); que no entiendo cómo se urlsobtienen todos los elementos etiquetados con 'a'. ¿Puedes explicar? Supongo que no es jQuery. ¿De qué función de biblioteca de prototipos estamos hablando?
zipzit
1
@zipzit En un puñado de navegadores, $$()es básicamente una abreviatura de document.querySelectorAll(). Más información en este enlace: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit
1

Otra alternativa podría ser

Array.from(document.querySelectorAll("a")).map(x => x.href)

Con tu $$(es aún más corto

Array.from($$("a")).map(x => x.href)
Sebastián
fuente
más 1 - así estás usando JS moderno. Ejecuté este programa y, aunque devolvió algunos enlaces, no devolvió todas las páginas .html que están en el nivel superior. ¿Hay alguna razón por la que no todas las páginas regresen a la lista de matrices? Gracias
Chris22
0

Si esta es una pregunta de programación, le sugiero que escriba su propia expresión regular para analizar todo el contenido recuperado. Las etiquetas de destino son IMG y A para HTML estándar. Para JAVA,

final String openingTags = "(<a [^>]*href=['\"]?|<img[^> ]* src=['\"]?)";

esto, junto con las clases Pattern y Matcher, debería detectar el comienzo de las etiquetas. Agregue la etiqueta LINK si también desea CSS.

Sin embargo, no es tan fácil como podría haber pensado inicialmente. Muchas páginas web no están bien formadas. Extraer programáticamente todos los enlaces que el ser humano puede "reconocer" es realmente difícil si necesitas tener en cuenta todas las expresiones irregulares.

¡Buena suerte!

mizubasho
fuente
18
No no no no, no analice HTML con expresiones regulares , ¡hace llorar al Niño Jesús!
dimo414
-2
function getalllinks($url) {
    $links = array();
    if ($fp = fopen($url, 'r')) {
        $content = '';
        while ($line = fread($fp, 1024)) {
            $content. = $line;
        }
    }
    $textLen = strlen($content);
    if ($textLen > 10) {
        $startPos = 0;
        $valid = true;
        while ($valid) {
            $spos = strpos($content, '<a ', $startPos);
            if ($spos < $startPos) $valid = false;
            $spos = strpos($content, 'href', $spos);
            $spos = strpos($content, '"', $spos) + 1;
            $epos = strpos($content, '"', $spos);
            $startPos = $epos;
            $link = substr($content, $spos, $epos - $spos);
            if (strpos($link, 'http://') !== false) $links[] = $link;
        }
    }
    return $links;
}

prueba este código ...

usuario4318981
fuente
10
Si bien esta respuesta probablemente sea correcta y útil, se prefiere si incluye alguna explicación junto con ella para explicar cómo ayuda a resolver el problema. Esto se vuelve especialmente útil en el futuro, si hay un cambio (posiblemente no relacionado) que haga que deje de funcionar y los usuarios deben comprender cómo funcionaba una vez.
Kevin Brown
2
Eh, es un poco largo.
ElectroBit
1
Completamente innecesario analizar el html de esta manera en php. php.net/manual/en/class.domdocument.php ¡ PHP tiene la capacidad de comprender el DOM!
JamesH