¿Cómo utiliza WGET para reflejar un sitio de 1 nivel de profundidad, recuperando recursos JS, CSS, incluidas imágenes CSS?

11

Supongamos que quiero que se descargue una copia simple de la página a mi HD para un mantenimiento permanente. No estoy buscando un get recursivo profundo, solo una página, sino también cualquier recurso cargado por esa página para que también se descargue.

Ejemplo: https://www.tumblr.com/

Esperar:

  • El index.html
  • Cualquier imagen cargada
  • Cualquier archivo JS cargado
  • Cualquier archivo CSS cargado
  • Cualquier imagen cargada en el archivo CSS
  • enlaces para los recursos de la página localizados para trabajar con las copias descargadas (sin dependencia de la web)

Me interesa saber si puede ayudarme a encontrar la mejor sintaxis de wget u otra herramienta que haga esto. Las herramientas que he probado generalmente no logran que las imágenes se carguen mediante CSS, por lo que la página nunca se ve bien cuando se carga localmente. ¡Gracias!

Solución tangente

Encontré una manera de hacer esto usando FireFox. El guardado predeterminado está roto y hay un complemento que se llama "Guardar Completo" que aparentemente puede hacer un buen trabajo con esto. Sin embargo, no puede descargarlo porque dice que no es compatible con la versión actual de FireFox. La razón es que se incluyó en este complemento: "Mozilla Archive Format". Instale eso, luego, cuando use Archivo> "Guardar página como ...", hay una nueva opción llamada "Página web completa", que es esencialmente el complemento anterior, que corrige la implementación de stock que usa Firefox (que es terrible). Esta no es una solución WGET, pero proporciona una solución viable.

EDITAR: Otro problema ridículo para cualquiera que pueda estar siguiendo esta pregunta en el futuro, tratando de hacer esto. Haga que el complemento funcione correctamente, necesita Herramientas> Formato de archivo de Mozilla y cambie la configuración predeterminada (terrible) de "tomar una instantánea fiel de la página" para "preservar los scripts y la fuente usando Guardar completa", de lo contrario el complemento vaciará todo sus archivos de script y reemplácelos con el texto "/ * Script eliminado por instantánea guardar * /".

Lana molinero
fuente
file> save as on firefox u otro navegador descargará todas las imágenes, archivos js y css
user31113
¿Realmente quiere los archivos, o simplemente quiere una versión correctamente representada de la página?
Quiero los archivos, de todos modos se les requeriría que representaran correctamente la página. Si no los tuvieras, se vería diferente. Archivo> Guardar como no funciona en Firefox. Si haces esto, no obtienes las imágenes CSS. Pruébalo en tumblr.com/login . Falta la imagen de fondo, falta la imagen bg para los campos de entrada.
Ninguna de las soluciones wget funcionó para mí. My Tangent Solution es el mejor método para lograr este tipo de ahorro de sitios. Sin embargo, lo he visto fallar en páginas muy complicadas como apple.com , presumiblemente porque muchas de las rutas de recursos se generan dinámicamente al ejecutar javascript, algunas no de inmediato sino durante algún tipo de ejecución de ajax.
Lana Miller

Respuestas:

12

wget -p -k http://ExampleSite.com

El -p le proporcionará todos los elementos necesarios para ver el sitio correctamente (CSS, imágenes, etc.). El -k cambiará todos los enlaces (para incluir aquellos para CSS e imágenes) para permitirle ver la página sin conexión tal como apareció en línea.

Actualización: Esto es específico para su sitio de ejemplo: tumblr.com

wget -H -N -k -p --exclude-domains quantserve.com --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2" https://www.tumblr.com

La caida:

-H = Permite que wget vaya a abarcar un host extranjero. Obligatorio ya que tumblr no tiene sus imágenes en la página principal en la misma dirección, están utilizando secure.assets.tumblr.com ver nota sobre la exclusión de dominios

-N = tomará solo los archivos más nuevos que los que tiene actualmente, en caso de que descargue la misma página nuevamente con el tiempo

-k = convierte tus enlaces para verlos sin conexión correctamente

-p = toma todos los elementos necesarios para verlo correctamente (css, imágenes, etc.)

--exclude-domains = dado que la página de inicio de tumblr.com tiene un enlace para quantserve.com y supongo que no quiere estas cosas, debe excluirlas de su descarga de wget. Nota : Esta es una muy importante que debe usar con -H porque si va a un sitio y tienen múltiples enlaces para hosts externos (piense en anunciantes y analíticas), ¡entonces también obtendrá esas cosas!

--no se requiere certificado de verificación ya que tumblr usa https

-U cambia el agente de usuario. No es realmente necesario en este caso, ya que permite el agente de usuario wget predeterminado, pero sé que algunos sitios lo bloquearán. Acabo de tirarlo aquí, así que en caso de que encuentre algún problema en otros sitios. En el fragmento de ejemplo que di, aparece como Mozilla Firefox 6.02a

finalmente tienes el sitio: https://www.tumblr.com


fuente
1
Intenté esto, no obtuve ningún archivo JS o CSS o imagen. ¿Tuviste?
Si lo está utilizando en tumblr (su ejemplo anterior), puede que tenga que especificar --no-check-certificate.
Creo que tienes razón, probablemente necesite esa opción. Todavía nada, excepto index.html, sin embargo. Algo falta ...
@LanaMiller Actualicé mi respuesta. Avíseme si hay algún problema.
¿No podrías hacer algo como -exclude-domains! = Tumblr.com?
alpha1
3

Para el sitio específico que mencionaste y muchos otros codificados como wget (y curl) simplemente no funcionarán. El problema es que algunos de los enlaces de activos necesarios para representar la página en un navegador se crean a través de JavaScript. Wget tiene una solicitud de función pendiente para ejecutar javascript:

http://wget.addictivecode.org/FeatureSpecifications/JavaScript

Sin embargo, hasta que se complete, los sitios que crean enlaces de activos usando javascript no podrán clonarse usando wget. La solución más fácil es encontrar una herramienta que realmente esté construyendo un DOM y analizando JavaScript como un motor de navegador (es decir, el método de Firefox que mencionó).

polinomio
fuente
1

También puede hacer esto automáticamente (o programáticamente si codifica) emitiendo un comando a través de shell usando wget:

wget --convert-links -r http://www.yourdomain.com

Descargará la página y los archivos internos y hará que los enlaces sean locales.

Jhourlad Estrella
fuente
1
Esto lo conseguirá todo . Lea la pregunta.
evgeny
-1
wget -r http://www.example.com

Creo que eso lo atrapará todo, pero pruébalo y descúbrelo.


fuente
1
Obtiene todo lo que es demasiado. Hasta ahora, la solución FireFox que encontré es la mejor solución de trabajo. Obtiene lo que necesita y nada más.
-1

$ ( hombre wget ):

-pags

- requisitos de página

Esta opción hace que Wget descargue todos los archivos que son necesarios para mostrar correctamente una página HTML dada. Esto incluye cosas como imágenes en línea, sonidos y hojas de estilo referenciadas.

Normalmente, al descargar una sola página HTML, no se descargan los documentos necesarios que puedan ser necesarios para mostrarla correctamente. El uso de -r junto con -l puede ayudar, pero dado que Wget no suele distinguir entre documentos externos e integrados, generalmente se dejan '' documentos de hoja '' a los que les faltan sus requisitos.

Por ejemplo, digamos que el documento 1.html contiene una etiqueta "<IMG>" que hace referencia a 1.gif y una etiqueta "<A>" que apunta al documento externo 2.html. Digamos que 2.html es similar pero que su imagen es 2.gif y está vinculada a 3.html. Digamos que esto continúa hasta un número arbitrariamente alto.

Si uno ejecuta el comando:

wget -r -l 2 http: // <sitio> /1.html

luego se descargarán 1.html, 1.gif, 2.html, 2.gif y 3.html. Como puede ver, 3.html no tiene su requisito 3.gif porque Wget simplemente está contando el número de saltos (hasta 2) lejos de 1.html para determinar dónde detener la recursión. Sin embargo, con este comando:

wget -r -l 2 -p http: // <sitio> /1.html

se descargarán todos los archivos anteriores y el 3.gml 3.html requerido. Similar,

wget -r -l 1 -p http: // <sitio> /1.html

hará que se descarguen 1.html, 1.gif, 2.html y 2.gif. Uno podría pensar que:

wget -r -l 0 -p http: // <sitio> /1.html

descargaría solo 1.html y 1.gif, pero desafortunadamente este no es el caso, porque -l 0 es equivalente a -l inf --- es decir, recursión infinita. Para descargar una sola página HTML (o un puñado de ellas, todas especificadas en la línea de comandos o en un archivo de entrada URL -i) y sus requisitos (o sus), simplemente deje fuera de -r y -l:

wget -p http: // <sitio> /1.html

Tenga en cuenta que Wget se comportará como si se hubiera especificado -r, pero solo se descargará esa página y sus requisitos. No se seguirán los enlaces de esa página a documentos externos. En realidad, para descargar una sola página y todos sus requisitos (incluso si existen en sitios web separados), y asegurarse de que el lote se muestre correctamente localmente, a este autor le gusta usar algunas opciones además de -p:

wget -E -H -k -K -p http: // <sitio> / <documento & gt ;

Para finalizar este tema, vale la pena saber que la idea de Wget de un enlace de documento externo es cualquier URL especificada en una etiqueta "<A>", una etiqueta "<AREA>" o una etiqueta "<LINK>" que no sea "< LINK REL = "hoja de estilo"> ".

James Sumners
fuente
2
¿Qué parte de esto crees que se parece a la solución? Porque intenté leer el contenido de la página de manual y no veo la solución correcta aquí. ¿Intentaste algo de esto tú mismo? ¿Cuál crees que es el comando que aborda la pregunta específicamente?