W jaki sposób używasz WGET do tworzenia kopii lustrzanej poziomu strony 1, odzyskując zasoby JS, CSS, w tym obrazy CSS?

11

Udawaj, że chciałem pobrać prostą kopię strony na mój HD w celu trwałego przechowywania. Nie szukam głębokiego rekurencyjnego pobierania, tylko pojedynczej strony, ale także wszelkich zasobów załadowanych przez tę stronę, które również powinny zostać pobrane.

Przykład: https://www.tumblr.com/

Oczekiwać:

  • Indeks.html
  • Wszelkie załadowane obrazy
  • Wszelkie załadowane pliki JS
  • Wszelkie załadowane pliki CSS
  • Wszelkie obrazy załadowane do pliku CSS
  • linki do zasobów strony zlokalizowanych do pracy z pobranymi kopiami (brak zależności od sieci)

Chcę wiedzieć, czy możesz mi pomóc znaleźć najlepszą składnię wget lub inne narzędzie, które to zrobi. Narzędzia, których wypróbowałem, zwykle nie ładują obrazów przez CSS, więc strona nigdy nie wygląda poprawnie, gdy jest ładowana lokalnie. Dziękuję Ci!

Rozwiązanie styczne

Znalazłem sposób na to za pomocą FireFox. Domyślne zapisywanie jest zepsute i istnieje dodatek o nazwie „Zapisywanie zakończone”, który najwyraźniej może z tym zrobić dobrą robotę. Nie można go jednak pobrać, ponieważ mówi, że nie jest obsługiwany w bieżącej wersji FireFox. Powodem jest to, że został on dodany do tego dodatku: „Mozilla Archive Format”. Zainstaluj to, a następnie, gdy użyjesz opcji Plik> „Zapisz stronę jako…”, pojawi się nowa opcja o nazwie „Strona internetowa zakończona”, która jest zasadniczo starym dodatkiem, który naprawia standardową implementację używaną przez FireFox (co jest okropne). To nie jest rozwiązanie WGET, ale zapewnia realne rozwiązanie.

EDYCJA: Kolejna niedorzeczna kwestia dla każdego, kto może śledzić to pytanie w przyszłości, próbując to zrobić. Spraw, aby dodatek działał poprawnie, musisz Narzędzia> Format archiwum Mozilli i zmienić (straszne) ustawienie domyślne „rób wierną migawkę strony” na „zachowaj skrypty i źródła za pomocą Zapisz zakończone”, w przeciwnym razie dodatek opróżni wszystko pliki skryptów i zamień je na tekst „/ * Skrypt usunięty przez zapisanie migawki * /”.

Lana Miller
źródło
plik> zapisz jak w firefoxie lub innej przeglądarce pobierze wszystkie obrazy, pliki js i css
user31113
Czy tak naprawdę chcesz pliki, czy po prostu chcesz poprawnie wyrenderowaną wersję strony?
Chcę pliki, ale i tak będą musiały poprawnie renderować stronę. Gdybyś ich nie miał, wyglądałoby to inaczej. Plik> Zapisz jako nie działa w przeglądarce Firefox. Jeśli to zrobisz, nie otrzymasz obrazów css. Wypróbuj na tumblr.com/login . Brak obrazu tła, brak obrazu tła dla pól wejściowych.
Żadne z rozwiązań wget nie działało dla mnie. My Tangent Solution to najlepsza metoda na osiągnięcie tego rodzaju oszczędności strony. Widziałem jednak, że zawodzi na bardzo skomplikowanych stronach, takich jak apple.com , prawdopodobnie dlatego, że wiele ścieżek zasobów jest generowanych dynamicznie przez wykonanie javascript, niektóre nie od razu, ale podczas pewnego rodzaju wykonywania ajax.
Lana Miller,

Odpowiedzi:

12

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

-P dostarczy ci wszystkich wymaganych elementów do poprawnego przeglądania strony (css, obrazy itp.). -K zmieni wszystkie linki (w tym te do CSS i obrazów), aby umożliwić ci przeglądanie strony offline, tak jak wyglądała online.

Aktualizacja: dotyczy konkretnej witryny przykładowej: 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

Podział:

-H = Pozwala wgetowi przejść do obsługi zagranicznego hosta. Wymagane, ponieważ tumblr nie ma swoich zdjęć na pierwszej stronie pod tym samym adresem, korzystają z secure.assets.tumblr.com patrz uwaga na temat wykluczania domen

-N = pobierze tylko te pliki, które są nowsze niż te, które aktualnie masz, na wypadek, gdyby z czasem ponownie pobierałeś tę samą stronę

-k = przekonwertuj swoje linki, aby poprawnie wyświetlić je offline

-p = pobiera wszystkie wymagane elementy, aby wyświetlić go poprawnie (css, obrazy itp.)

--exclude-domains = ponieważ strona główna tumblr.com zawiera link do quantserve.com i domyślam się, że nie chcesz tego, musisz wykluczyć go z pobierania wget. Uwaga : jest to bardzo ważna funkcja, której powinieneś używać z -H, ponieważ jeśli wejdziesz na stronę i mają one wiele linków do zewnętrznych hostów (pomyśl o reklamodawcach i materiałach analitycznych), to również będziesz chciał pobrać te rzeczy!

- nie jest wymagany certyfikat-check, ponieważ tumblr używa https

-U zmienia klienta użytkownika. W tym przypadku nie jest to konieczne, ponieważ pozwala domyślnemu klientowi użytkownika wget, ale wiem, że niektóre strony go zablokują. Właśnie go tu wrzuciłem, na wypadek gdybyś napotkał jakieś problemy na innych stronach. W przykładowym fragmencie, który podałem, pojawia się jako Mozilla Firefox 6.02a

wreszcie masz stronę: https://www.tumblr.com


źródło
1
Próbowałem tego, nie otrzymałem żadnych plików JS, CSS ani plików graficznych. Czy ty?
Jeśli używasz go na tumblr (twój przykład powyżej), może być konieczne określenie --no-check-certificate.
Myślę, że masz rację, prawdopodobnie ta opcja jest potrzebna. Jednak nadal nic oprócz index.html. Czegoś brakuje ...
@LanaMiller Zaktualizowałem swoją odpowiedź. Daj mi znać, jeśli są jakieś problemy.
Czy nie możesz zrobić czegoś takiego jak -exclude-domains! = Tumblr.com?
alpha1
3

W przypadku konkretnej witryny, o której wspomniałeś, i wielu innych zakodowanych jak wget (i curl) po prostu nie będzie działać. Problem polega na tym, że niektóre łącza zasobów wymagane do renderowania strony w przeglądarce są tworzone przez javascript. Wget oczekuje na uruchomienie funkcji javascript:

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

Jednak do tego czasu strony budujące linki do zasobów za pomocą javascript nie będą klonowane za pomocą wget. Najłatwiejszym rozwiązaniem jest znalezienie narzędzia, które faktycznie buduje DOM i analizuje javascript, tak jak silnik przeglądarki (tj. Wspomniana metoda firefox).

wielomian
źródło
1

Możesz to również zrobić automatycznie (lub programowo, jeśli wykonujesz kodowanie), wydając polecenie przez powłokę za pomocą wget:

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

Spowoduje to pobranie strony i plików wewnętrznych oraz uczynienie linków lokalnymi.

Jhourlad Estrella
źródło
1
To wszystko dostanie . Przeczytaj pytanie
evgeny
-1
wget -r http://www.example.com

Myślę, że to wszystko złapie, ale spróbuj i przekonaj się.


źródło
1
Dostaje wszystko, co jest zdecydowanie za dużo. Jak dotąd rozwiązanie FireFox, które znalazłem, jest najlepszym działającym rozwiązaniem. Dostaje to, czego potrzebujesz i nic więcej.
-1

$ ( człowiek wget ):

-p

- wymagane strony

Ta opcja powoduje, że Wget pobiera wszystkie pliki niezbędne do prawidłowego wyświetlenia danej strony HTML. Obejmuje to między innymi wstawiane obrazy, dźwięki i odnośne arkusze stylów.

Zwykle podczas pobierania pojedynczej strony HTML wszelkie wymagane dokumenty, które mogą być potrzebne do jej prawidłowego wyświetlenia, nie są pobierane. Używanie opcji -r razem z opcją -l może pomóc, ale ponieważ Wget zwykle nie rozróżnia dokumentów zewnętrznych od dokumentów wstawianych, zwykle pozostawia się „dokumenty liściowe”, które nie spełniają swoich wymagań.

Na przykład powiedzmy, że dokument 1.html zawiera znacznik „<IMG>” odnoszący się do 1.gif i znacznik „<A>” wskazujący na zewnętrzny dokument 2.html. Powiedz, że 2.html jest podobny, ale jego obraz to 2.gif i że prowadzi do 3.html. Powiedzmy, że trwa to do dowolnej arbitralnie wysokiej liczby.

Jeśli ktoś wykona polecenie:

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

następnie zostaną pobrane 1.html, 1.gif, 2.html, 2.gif i 3.html. Jak widać, 3.html nie ma wymaganego 3.gif, ponieważ Wget po prostu odlicza liczbę przeskoków (do 2) od 1.html w celu ustalenia, gdzie zatrzymać rekursję. Jednak za pomocą tego polecenia:

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

wszystkie powyższe pliki i 3.html wymagany 3.gif zostaną pobrane. Podobnie,

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

spowoduje pobranie 1.html, 1.gif, 2.html i 2.gif. Można by pomyśleć, że:

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

pobierałby tylko 1.html i 1.gif, ale niestety tak nie jest, ponieważ -l 0 jest równoważne z -l inf --- czyli nieskończoną rekurencją. Aby pobrać pojedynczą stronę HTML (lub garść z nich, wszystkie określone w wierszu polecenia lub w pliku wejściowym -i URL) i jej (lub ich) wymaganiach, po prostu wyłącz -r i -l:

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

Zauważ, że Wget będzie zachowywał się tak, jakby podano -r, ale zostanie pobrana tylko ta jedna strona i jej wymagania. Odsyłacze z tej strony do dokumentów zewnętrznych nie będą śledzone. W rzeczywistości, aby pobrać pojedynczą stronę i wszystkie jej wymagania (nawet jeśli istnieją na osobnych stronach internetowych) i upewnić się, że działka wyświetla się lokalnie, autor lubi korzystać z kilku opcji oprócz -p:

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

Na zakończenie tego tematu warto wiedzieć, że pomysł Wget dotyczący łącza do dokumentu zewnętrznego to dowolny adres URL określony w tagu „<A>”, tagu „<AREA>” lub tagu „<LINK>” innym niż „< LINK REL = „arkusz stylów”> ”.

James Sumners
źródło
2
Jak myślisz, która część tego rozwiązania jest podobna do rozwiązania? Ponieważ próbowałem przeczytać zawartość strony man i nie widzę tutaj poprawnego rozwiązania. Próbowałeś czegoś takiego sam? Jak myślisz, co to polecenie odnosi się konkretnie do pytania.