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.


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.


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)

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)

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!


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 ...


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.