Comment utilisez-vous WGET pour mettre en miroir un site de niveau 1 en profondeur, en récupérant JS, des ressources CSS, y compris des images CSS?

11

Imaginez que je voulais une simple copie de page à télécharger sur mon disque dur pour une conservation permanente. Je ne recherche pas un get récursif profond, juste une seule page, mais aussi des ressources chargées par cette page à télécharger également.

Exemple: https://www.tumblr.com/

Attendre:

  • L'index.html
  • Toutes les images chargées
  • Tous les fichiers JS chargés
  • Tous les fichiers CSS chargés
  • Toutes les images chargées dans le fichier CSS
  • liens pour les ressources de la page localisées pour fonctionner avec les copies téléchargées (pas de dépendance Web)

Je suis intéressé de savoir si vous pouvez m'aider à trouver la meilleure syntaxe wget ou un autre outil qui le fera. Les outils que j'ai essayés ne parviennent généralement pas à charger les images par CSS, de sorte que la page ne semble jamais correcte lorsqu'elle est chargée localement. Je vous remercie!

Solution tangente

J'ai trouvé un moyen de le faire en utilisant FireFox. La sauvegarde par défaut est interrompue et il existe un module complémentaire appelé "Save Complete" qui peut apparemment faire un bon travail avec cela. Cependant, vous ne pouvez pas le télécharger car il indique qu'il n'est pas pris en charge dans la version actuelle de FireFox. La raison en est qu'il a été intégré à cet addon: "Mozilla Archive Format". Installez-le, puis lorsque vous utilisez Fichier> "Enregistrer la page sous ..", il y a une nouvelle option appelée "Page Web, complète" qui est essentiellement l'ancien addon, qui corrige l'implémentation de stock utilisée par FireFox (ce qui est terrible). Ce n'est pas une solution WGET mais elle fournit une solution viable.

EDIT: Un autre problème ridicule pour quiconque pourrait suivre cette question à l'avenir, en essayant de le faire. Assurez-vous que l'addon fonctionne correctement, vous devez Outils> Format d'archive Mozilla et modifiez le paramètre par défaut (terrible) de "prendre un instantané fidèle de la page" pour "préserver les scripts et la source à l'aide de Save Complete", sinon l'addon videra tout vos fichiers de script et remplacez-les par le texte "/ * Script supprimé par snapshot save * /".

Lana Miller
la source
fichier> enregistrer sous sur Firefox ou un autre navigateur téléchargera toutes les images, fichiers js et css
user31113
Voulez-vous réellement les fichiers, ou voulez-vous simplement une version correctement rendue de la page?
Je veux les fichiers, ils seraient de toute façon nécessaires pour restituer correctement la page. Si vous ne les aviez pas, cela aurait l'air différent. Fichier> Enregistrer sous ne fonctionne pas dans Firefox. Si vous faites cela, vous n'obtiendrez pas les images CSS. Essayez-le sur tumblr.com/login . Image d'arrière-plan manquante, image bg pour les champs de saisie manquante.
Aucune des solutions wget n'a fonctionné pour moi. Ma solution Tangent est la meilleure méthode pour réaliser ce type de sauvegarde de site. Cependant, je l'ai vu échouer sur des pages très compliquées comme apple.com , probablement parce que beaucoup de chemins de ressources sont générés dynamiquement en exécutant javascript, certains pas tout de suite mais pendant une sorte d'exécution ajax.
Lana Miller

Réponses:

12

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

Le -p vous obtiendra tous les éléments nécessaires pour visualiser correctement le site (css, images, etc.). Le -k changera tous les liens (pour inclure ceux pour CSS et les images) pour vous permettre d'afficher la page hors ligne telle qu'elle est apparue en ligne.

Mise à jour: Ceci est spécifique à votre exemple de site: 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 panne:

-H = Permet à wget d'aller s'étendre sur un hôte étranger. Obligatoire puisque tumblr n'a pas ses images en première page sur la même adresse, il utilise secure.assets.tumblr.com voir la note sur l'exclusion de domaines

-N = ne récupérera que les fichiers plus récents que ceux que vous possédez actuellement, au cas où vous téléchargeriez à nouveau la même page au fil du temps

-k = convertir vos liens pour les visualiser correctement hors ligne

-p = récupère tous les éléments nécessaires pour l'afficher correctement (css, images, etc.)

--exclude-domaines = puisque la page d'accueil tumblr.com a un lien pour quantserve.com et je suppose que vous ne voulez pas ce genre de choses, vous devez l'exclure de votre téléchargement wget. Remarque : Ceci est assez important que vous devez utiliser avec -H parce que si vous allez sur un site et qu'ils ont plusieurs liens pour des hôtes externes (pensez aux annonceurs et aux analyses), vous allez également saisir ces informations!

--no-check-certificate requis car tumblr utilise https

-U change l'agent utilisateur. Pas vraiment nécessaire dans ce cas car il autorise l'agent utilisateur wget par défaut mais je sais que certains sites le bloqueront. Je viens de le jeter ici, donc au cas où vous rencontriez des problèmes sur d'autres sites. Dans l'exemple d'extrait que j'ai donné, il apparaît comme Mozilla Firefox 6.02a

enfin vous avez le site: https://www.tumblr.com


la source
1
J'ai essayé cela, je n'ai pas obtenu de fichiers JS, CSS ou image. As tu?
Si vous l'utilisez sur tumblr (votre exemple ci-dessus), vous devrez peut-être spécifier --no-check-certificate.
Je pense que vous avez raison, il a probablement besoin de cette option. Toujours rien sauf index.html cependant. Quelque chose manque ...
@LanaMiller J'ai mis à jour ma réponse. Faites-moi savoir s'il y a des problèmes.
Ne pourriez-vous pas faire quelque chose comme -exclude-domaines! = Tumblr.com?
alpha1
3

Pour le site spécifique que vous avez mentionné et beaucoup d'autres codés comme ça, wget (et curl) ne fonctionneront tout simplement pas. Le problème est que certains des liens d'actifs requis pour afficher la page dans un navigateur sont eux-mêmes créés via javascript. Wget a une demande de fonctionnalité en attente pour exécuter javascript:

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

Cependant, tant que cela n'est pas terminé, les sites qui créent des liens d'actifs à l'aide de javascript ne seront pas clonables à l'aide de wget. La solution la plus simple consiste à trouver un outil qui construit réellement un DOM et analyse le javascript comme un moteur de navigateur (c'est-à-dire la méthode firefox que vous avez mentionnée).

polynôme
la source
1

Vous pouvez également le faire automatiquement (ou par programmation si vous faites du codage) en émettant une commande via shell à l'aide de wget:

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

Il télécharge la page et les fichiers internes et rend les liens locaux.

Jhourlad Estrella
la source
1
Cela obtiendra tout . Lisez la question.
evgeny
-1
wget -r http://www.example.com

Je pense que ça va tout saisir, mais essayez-le et découvrez.


la source
1
Il obtient tout ce qui est beaucoup trop. Jusqu'à présent, la solution FireFox que j'ai trouvée est la meilleure solution de travail. Il obtient ce dont vous avez besoin et rien de plus.
-1

$ ( homme wget ):

-p

--page-requis

Cette option oblige Wget à télécharger tous les fichiers nécessaires pour afficher correctement une page HTML donnée. Cela inclut des éléments tels que des images, des sons et des feuilles de style référencées.

Normalement, lors du téléchargement d'une seule page HTML, tous les documents requis qui peuvent être nécessaires pour l'afficher correctement ne sont pas téléchargés. L'utilisation de -r avec -l peut aider, mais comme Wget ne fait généralement pas de distinction entre les documents externes et les documents en ligne, on se retrouve généralement avec des «documents feuilles» qui manquent de leurs exigences.

Par exemple, supposons que le document 1.html contient une balise "<IMG>" faisant référence à 1.gif et une balise "<A>" pointant vers le document externe 2.html. Disons que 2.html est similaire mais que son image est 2.gif et qu'il est lié à 3.html. Disons que cela continue jusqu'à un nombre arbitrairement élevé.

Si l'on exécute la commande:

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

puis 1.html, 1.gif, 2.html, 2.gif et 3.html seront téléchargés. Comme vous pouvez le voir, 3.html est sans son 3.gif requis car Wget compte simplement le nombre de sauts (jusqu'à 2) à partir de 1.html afin de déterminer où arrêter la récursivité. Cependant, avec cette commande:

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

tous les fichiers ci-dessus et le 3.gif requis de 3.html seront téléchargés. De même,

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

entraînera le téléchargement de 1.html, 1.gif, 2.html et 2.gif. On pourrait penser que:

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

ne téléchargerait que 1.html et 1.gif, mais ce n'est malheureusement pas le cas, car -l 0 est équivalent à -l inf --- c'est-à-dire une récursion infinie. Pour télécharger une seule page HTML (ou une poignée d'entre elles, toutes spécifiées sur la ligne de commande ou dans un fichier d'entrée URL -i) et ses (ou leurs) éléments requis, laissez simplement -r et -l:

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

Notez que Wget se comportera comme si -r avait été spécifié, mais seule cette page unique et ses éléments requis seront téléchargés. Les liens de cette page vers des documents externes ne seront pas suivis. En fait, pour télécharger une seule page et toutes ses exigences (même si elles existent sur des sites Web séparés), et s'assurer que le lot s'affiche correctement localement, cet auteur aime utiliser quelques options en plus de -p:

wget -E -H -k -K -p http: // <site> / <document & gt ;

Pour terminer ce sujet, il convient de savoir que l'idée de Wget d'un lien de document externe est n'importe quelle URL spécifiée dans une balise "<A>", une balise "<AREA>" ou une balise "<LINK>" autre que "< LINK REL = "feuille de style"> ".

James Sumners
la source
2
Selon vous, quelle partie de cela ressemble à la solution? Parce que j'ai essayé de lire le contenu de la page de manuel et je ne vois pas la bonne solution ici. Avez-vous essayé tout cela vous-même? Selon vous, quelle est la commande qui répond spécifiquement à la question.