Zapisz pojedynczą stronę internetową (z obrazami w tle) za pomocą Wget

73

Chcę używać Wget do zapisywania pojedynczych stron internetowych (nie rekurencyjnie, nie całych witryn) w celach informacyjnych. Podobnie jak „Strona internetowa Firefox kompletna”.

Mój pierwszy problem to: nie mogę zmusić Wget do zapisania obrazów tła określonych w CSS. Nawet jeśli zapisało to pliki obrazów tła, nie sądzę - Convert-links przekonwertowałoby adresy URL obrazu tła w pliku CSS, aby wskazywały na lokalnie zapisane obrazy tła. Firefox ma ten sam problem.

Mój drugi problem to: jeśli na stronie chcę zapisać obrazy hostowane na innym serwerze (np. Reklamy), nie zostaną one uwzględnione. --span-hosts nie wydaje się rozwiązać tego problemu w poniższym wierszu.

Używam: wget --no-parent --timestamping --convert-links --page-requisites --no-directories --no-host-directories -erobots=off http://domain.tld/webpage.html

użytkownik14124
źródło
1
dokładnie ta sama linia (wget --no-parent - timestamping --convert-links --page-Requisites --no-directories --no-host-directories -erobots = off domain.tld) ​​faktycznie zapisuje obrazy tła, do których odwołuje się CSS po aktualizacji do 1.12. Instrukcja mówi: „W przypadku adresów URL Wget pobiera i analizuje html lub css z podanego adresu URL, pobierając pliki, do których odnosi się dokument, poprzez znaczniki takie jak href lub src lub wartości css uri określone za pomocą funkcji„ url () ” notacja." Drugi problem musi zostać rozwiązany
14124

Odpowiedzi:

106

Ze strony podręcznika użytkownika Wget :

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 używać kilku opcji oprócz „-p”:

wget -E -H -k -K -p http://www.example.com/

Również w przypadku, gdy robots.txtnie zezwalasz na dodanie-e robots=off

vvo
źródło
Wygląda na to, że przepisuje tylko js i css do bezwzględnych adresów URL
Greg Dean
1
nieważne, to robots.txt nie zezwalał mi na aktualizację odpowiedzi z obejściem
Greg Dean
19
Rozszerzono:wget --adjust-extension --span-hosts --convert-links --backup-converted --page-requisites [url]
Sam
4
Albo jeszcze lepiej wget --recursive --no-clobber --page-requisites --html-extension --convert-links --restrict-file-names=windows[url]
Petah
@ {etah: Próbowałem twojej komendy z twoimi argumentami, pobierze ona inne strony oprócz podanej.
Tim
7

wgetKomenda oferuje opcję --mirror, która robi to samo, co:

$ wget -r -N -l inf --no-remove-listing

Możesz również wrzucić, -xaby utworzyć całą hierarchię katalogów dla witryny, w tym nazwę hosta.

Być może nie możesz tego znaleźć, jeśli jednak nie używasz najnowszej wersji wget.

Ernie Dunbar
źródło
1
Najprawdopodobniej spowoduje to przeszukanie całej witryny wraz z jej podadresami
4253wyerg4e,
2

Wygląda na to, że wgetFirefox nie analizuje CSS pod kątem linków do włączenia tych plików do pobrania. Możesz obejść te ograniczenia, sprawdzając, co potrafisz i skryptując ekstrakcję linków z dowolnego CSS lub Javascript w pobranych plikach, aby wygenerować listę plików, które przegapiłeś. Następnie drugie uruchomienie wgettej listy łączy może pobrać wszystko, co zostało pominięte (użyj -iflagi, aby podać adresy URL list plików).

Jeśli podoba Ci się Perl, na CPAN jest moduł CSS :: Parser , który może dać ci łatwy sposób na wyodrębnienie linków w ten sposób.

Zauważ, że wgetparsuje tylko niektóre znaczniki HTML ( href/ src) i css uris ( url()) w celu ustalenia, jakie strony należy pobrać. Możesz spróbować użyć dodatków Firefox, takich jak DOM Inspector lub Firebug, aby dowiedzieć się, czy obrazy innych firm, których nie otrzymujesz, są dodawane przez JavaScript - jeśli tak, musisz skorzystać ze skryptu lub wtyczki Firefox, aby je uzyskać też.

quack quixote
źródło
Tak jak powiedziałem w komentarzu do mojego pierwszego postu, wydaje się, że zostało to naprawione w wersji 1.12. Nadal nie wiem, jak dołączyć obrazy znajdujące się na innych serwerach.
user14124
tak, parsowanie CSS jest nowością w wget v1.12, jest na górze dziennika zmian: freshmeat.net/urls/376000c9c7a02f7a3592180c2390ff04
quack quixote
Spróbuj dodać opcję -H do listy. To oznacza --span-hosts i pozwala na pobieranie treści z hostów zewnętrznych.
Michael