Como llegar WGET para descargar exactamente la misma página Web HTML como el navegador


34

Con un navegador web (IE o Chrome) puedo guardar una página web (.html) con Ctl-S, inspeccionarla con cualquier editor de texto y ver los datos en formato de tabla. Quiero extraer uno de esos números, pero para muchas, muchas páginas web, demasiadas para hacerlo manualmente. Así que me gustaría usar WGET para obtener esas páginas web una tras otra, y escribir otro programa para analizar el .html y recuperar el número que quiero. Pero el archivo .html guardado por WGET cuando usa la misma URL que el navegador no contiene la tabla de datos. Por qué no? Es como si el servidor detectara que la solicitud proviene de WGET y no de un navegador web, y proporciona una página web esqueleto, que carece de la tabla de datos. ¿Cómo puedo obtener exactamente la misma página web con WGET? - ¡Gracias!

MÁS INFORMACIÓN:

Un ejemplo de la URL que estoy tratando a buscar es: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US donde el ICENX cadena es un símbolo de fondos de inversión , que estaré cambiar a cualquiera de un número de diferentes símbolos de cotización. Esta descarga una tabla de datos cuando se ve en un navegador, pero la tabla de datos no se encuentra si descabellada con WGET.


¿Qué url es?
Braiam

2
Lo más probable es el código HTML inicial se rellena utilizando técnicas AJAX por un fragmento de JavaScript que descarga y rellena la tabla. En este caso, probablemente tendría mejor suerte wgetting la llamada a este script. Al igual que Braiam pregunta, si se proporciona la URL podemos estar en mejores condiciones para resolver esto ayuda.
roadmr

1
ad Más información: En el navegador, cuando se visualiza un código de fuente, que no se ve el código HTML original (el mismo que tiene por wget) pero HTML actualizada por Javascript / Ajax. Los navegadores modernos espectáculos como fuente generado en lugar de la versión HTML.
Vrata Blazek

Respuestas:


39

Como notó roadmr , la tabla en esta página es generada por javascript. wget no es compatible con javascript, simplemente voltea la página tal como la recibió del servidor (es decir, antes de que se ejecute ningún código javascript) y, por lo tanto, falta la tabla.

Necesita un navegador sin cabeza que admita JavaScript como phantomjs :

$ phantomjs save_page.js http://example.com > page.html

con save_page.js:

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

Entonces, si solo desea extraer algo de texto, lo más fácil podría ser renderizar la página con w3m:

$ w3m -dump page.html

y / o modifique el script phantomjs para volcar lo que le interesa.


Esto tampoco funciona, por ejemplo cotrino.com/lifespan
mrgloom

Los enlaces generados por JS no funcionarán con eso
QkiZ

1
2018: el proyecto PhantomJS se suspende hasta nuevo aviso :(
1rq3fea324wre

Esta solución es solo para descargar páginas de URL especificadas. ¿Cómo se conecta el mecanismo de rastreo del sitio de wget con él? Además, ¿cómo se vería el guión con Chrome sin cabeza?
Phil

10

Puede descargar un sitio web completo usando wget --mirror

Ejemplo:

wget --mirror -p --convert-links -P ./LOCAL-DIR WEBSITE-URL

La línea de comando anterior que desea ejecutar cuando desea descargar un sitio web completo y está disponible para su visualización local.

Opciones:

  • --mirror activa las opciones adecuadas para duplicar.

  • -p descarga todos los archivos que son necesarios para mostrar correctamente una página HTML determinada.

  • --convert-links después de la descarga, convierta los enlaces en el documento para su visualización local.

  • -P ./LOCAL-DIR guarda todos los archivos y directorios en el directorio especificado.

Para obtener más información sobre las opciones de Wget, lea más este artículo: Descripción general sobre todos los comandos de wget con ejemplos , o consulte la página de manual de Wget .


2
Esto no funcionará con contenido renderizado de JavaScript. Para eso necesitarás usar phantomjs según lo respondido por lemonsqueeze.
Mattias

1
Este cmd también recorrerá todas las sub-urls, que descargarán recursos que no son necesarios para representar la página web dada.
1rq3fea324wre

3

En lugar de --recursive, que simplemente continuará y "arañará" cada enlace en su URL, use --page-requisites. Debería comportarse exactamente como las opciones que describe en los navegadores gráficos.

       This option causes Wget to download all the files that are
       necessary to properly display a given HTML page.  This includes
       such things as inlined images, sounds, and referenced stylesheets.

       Ordinarily, when downloading a single HTML page, any requisite
       documents that may be needed to display it properly are not
       downloaded.  Using -r together with -l can help, but since Wget
       does not ordinarily distinguish between external and inlined
       documents, one is generally left with "leaf documents" that are
       missing their requisites.

Para obtener más información, man wgetbusque y busque la --page-requisitesopción (use "/" para buscar mientras lee una página de manual).


2

Si la respuesta del servidor difiere dependiendo de una fuente que pregunta, se debe principalmente a la variable HTTP_USER_AGENT (solo una cadena de texto) que se proporciona con una solicitud de la fuente que pregunta, informando al servidor sobre la tecnología.


  1. Puede consultar su agente de navegador aquí -> http://whatsmyuseragent.com

  2. Según el manual de WGET, este parámetro debería hacer el trabajo --user-agent=AGENT.


Si esto no ayuda, es decir, puede ser necesario el procesamiento de JavaScript para obtener la misma página que un navegador, o tal vez una solicitud apropiada con parámetros GET para que el servidor prepare una respuesta que no requiera JavaScript para llenar la página.

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.