Comment faire pour que WGET télécharge exactement la même page Web que le navigateur

34

Utilisation d'un navigateur Web (IE ou Chrome) Je peux enregistrer une page Web (.html) avec Ctl-S, l'inspecter avec n'importe quel éditeur de texte et afficher les données sous forme de tableau. Un de ces chiffres que je veux extraire, mais pour beaucoup, beaucoup de pages Web, trop pour être fait manuellement. J'aimerais donc utiliser WGET pour obtenir ces pages Web l'une après l'autre et écrire un autre programme pour analyser le fichier .html et récupérer le numéro que je veux. Mais le fichier .html enregistré par WGET lorsqu’il utilise la même URL que le navigateur ne contient pas la table de données. Pourquoi pas? C'est comme si le serveur détectait que la requête venait de WGET et non d'un navigateur Web, et fournissait une page Web squelette, sans le tableau de données. Comment puis-je obtenir exactement la même page Web avec WGET? - THX!

PLUS D'INFORMATIONS:

Voici un exemple de l'URL que j'essaie d' extraire : http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US où la chaîne ICENX est un symbole boursier de fonds mutuels. , que je changerai pour n’importe lequel des différents symboles boursiers. Cette opération télécharge une table de données lorsqu'elle est affichée dans un navigateur, mais la table de données est manquante si elle est extraite avec WGET.

utilisateur239598
la source
De quelle url s'agit-il?
Braiam
2
Très probablement, le code HTML initial est rempli à l'aide des techniques AJAX par un fragment javascript qui télécharge et remplit le tableau. Dans ce cas, vous auriez probablement plus de chance en appelant ce script. Comme Braiam le demande, si vous fournissez l'URL, nous pourrons peut-être mieux vous aider.
roadmr
1
ad Plus d'infos: Dans les navigateurs, lorsque vous affichez un code source, vous ne voyez pas le code HTML d'origine (identique à celui obtenu par wget), mais un code HTML mis à jour par javascript / ajax. Les navigateurs modernes affichent cette source générée au lieu du code HTML brut.
Vrata Blazek le

Réponses:

39

Comme le note roadmr , le tableau de cette page est généré par javascript. wget ne prend pas en charge javascript, il vide simplement la page telle que reçue du serveur (c'est-à-dire avant tout code javascript) et le tableau est manquant.

Vous avez besoin d'un navigateur sans navigateur prenant en charge javascript, comme phantomjs :

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

avec save_page.js:

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

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

Ensuite, si vous voulez seulement extraire du texte, le plus simple serait de rendre la page avec w3m:

$ w3m -dump page.html

et / ou modifiez le script phantomjs pour simplement vider ce qui vous intéresse.

citron
la source
Cela ne fonctionne pas non plus, par exemple cotrino.com/lifespan
mrgloom
Les liens générés par JS ne fonctionneront pas avec ça
QkiZ
1
2018: le projet PhantomJS est suspendu jusqu'à nouvel ordre :(
1rq3fea324wre
Cette solution est uniquement destinée au téléchargement de pages à partir d'URL spécifiés. Comment dirigez-vous le mécanisme d'exploration du site de wget avec celui-ci? En outre, à quoi ressemblerait le script avec du chrome sans tête?
Phil
10

Vous pouvez télécharger un site Web complet en utilisant wget --mirror

Exemple:

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

La ligne de commande ci-dessus que vous souhaitez exécuter lorsque vous souhaitez télécharger un site Web complet et mise à disposition pour un affichage local.

Options:

  • --mirror active les options appropriées pour la mise en miroir.

  • -p télécharge tous les fichiers nécessaires pour afficher correctement une page HTML donnée.

  • --convert-links après le téléchargement, convertissez les liens dans le document pour une visualisation locale.

  • -P ./LOCAL-DIR enregistre tous les fichiers et répertoires dans le répertoire spécifié.

Pour plus d'informations sur les options Wget Lisez cet article: Présentation À propos de toutes les commandes wget avec exemples ou consultez la page de manuel de Wget .

GowriShankar
la source
2
Cela ne fonctionnera pas avec le contenu rendu javascript. Pour cela, vous devrez utiliser des phantomjs comme indiqué par lemonsqueeze.
Mattias
1
Cette cmd parcourra également toutes les sous-URL, ce qui téléchargera des ressources qui ne sont pas nécessaires pour rendre la page Web donnée.
1rq3fea324wre
3

Au lieu de --recursive, qui va juste aller de l'avant et "spider" chaque lien dans votre URL, utilisez --page-requisites. Devrait se comporter exactement comme les options que vous décrivez dans les navigateurs graphiques.

       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.

Pour plus d'informations, man wgetrecherchez l' --page-requisitesoption (utilisez "/" pour effectuer une recherche en lisant une page de manuel).

roadmr
la source
2

Si la réponse du serveur diffère en fonction de la source demandée, c'est principalement à cause de la variable HTTP_USER_AGENT (juste une chaîne de texte) qui est fournie avec une demande de la source demandeuse, informant le serveur de la technologie.


  1. Vous pouvez vérifier votre agent de navigateur ici -> http://whatsmyuseragent.com

  2. Selon le manuel WGET, ce paramètre devrait faire l'affaire --user-agent=AGENT.


Si cela ne résout pas le problème, un traitement JavaScript peut être nécessaire pour obtenir la même page qu'un navigateur ou une requête appropriée avec des paramètres GET afin que le serveur prépare une réponse ne nécessitant pas l'utilisation de JavaScript pour remplir la page.

Esamo
la source