2012-06-20 10 views
30

Próbuję użyć wget polecenie:Dlaczego wget pobiera plik index.html tylko dla niektórych witryn?

wget -p http://www.example.com 

aby pobrać wszystkie pliki znajdujące się na stronie głównej. W przypadku niektórych witryn działa, ale w większości przypadków pobiera tylko plik index.html. Próbowałem polecenia wget -r, ale to nie działa. Ktoś wie, jak pobrać wszystkie pliki na stronie, lub po prostu podać mi listę plików i odpowiadających im adresów URL na stronie?

+1

Czy masz przykładowy adres URL? – Fabien

+0

Czym różni się to od [poprzedniego pytania] (http://stackoverflow.com/questions/11123477/how-to-get-a-list-of-all-paths-files-on-a-webpage-using- wget-or-curl-in-php)? Jeśli to ten sam problem, edytuj stare pytanie, aby je wyjaśnić. –

+0

Możliwy duplikat [jak uzyskać listę wszystkich ścieżek/plików na stronie internetowej za pomocą wget lub curl w php?] (Https://stackoverflow.com/questions/11123477/how-to-get-a-list-of -all-paths-files-on-a-page-using-wget-or-curl-in-php) –

Odpowiedz

63

Wget jest również w stanie pobrać całą witrynę. Ale ponieważ może to spowodować duże obciążenie serwera, wget będzie przestrzegał pliku robots.txt.

wget -r -p http://www.example.com 

Parametr -p mówi wget, aby uwzględnić wszystkie pliki, w tym obrazy. Oznacza to, że wszystkie pliki HTML będą wyglądały jak powinny.

A co jeśli nie chcesz, aby Wget był posłuszny plikowi robots.txt? Można po prostu dodać -E robotów = off do polecenia jak poniżej:

wget -r -p -e robots=off http://www.example.com 

Jak wiele stron nie pozwoli Ci pobrać całą witrynę, będą sprawdzać adresu przeglądarki tożsamość. Aby obejść ten problem, użyj -U mozilla, jak to wyjaśniłem powyżej.

wget -r -p -e robots=off -U mozilla http://www.example.com 

Wielu właścicieli witryn nie spodoba się faktowi, że pobierasz całą witrynę. Jeśli serwer zobaczy, że pobierasz dużą liczbę plików, może automatycznie dodać cię do czarnej listy. Sposób obejścia tego polega na odczekaniu kilku sekund po każdym pobraniu. Aby to zrobić, użyj wget -tait = X (gdzie X to ilość sekund).

możesz również użyć parametru: --random-wait, aby pozwolić wget wybrać losową liczbę sekund czekać. Aby dołączyć do tego polecenia:

wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com 
+3

Dziękuję za odpowiedź. Wypróbowałem 3 sposoby, które wymieniłeś na popularnych adresach URL (np. Amazon.com), ale otrzymałem tylko index.html. Czy masz jakieś inne sugestie? –

+3

to samo tutaj. Tylko index.html – BigSack

+3

@JayH spróbuj nie używać adresu, który zostanie przekierowany. IE, jeśli użyjesz '' 'http: // amazon.com''' to nie zadziała, ponieważ zostaniesz przekierowany na stronę www.amazon.com, ale jeśli użyjesz' '' http: //www.amazon .com''' rozpocznie pobieranie całej witryny. Możliwość nieśledzenia pliku z robotami jest czymś mniej "grzecznym", więc nie będzie działać tak dobrze, jak możesz sobie wyobrazić. –

0

Jeśli spojrzeć na index.html w the wget manual można wybrać opcję --default-page=name który index.html domyślnie. Możesz na przykład zmienić na index.php.

--default-page=index.php 
2

Wiem, że ten wątek jest stary, ale spróbuj tego, co jest wymienione przez Ritesh z:

--no-ciasteczka

on pracował dla mnie!

4

Podany link jest stroną główną lub /index.html, dlatego jasne jest, że otrzymujesz tylko stronę index.html. Aby uzyskać rzeczywiste pobieranie, na przykład w przypadku pliku "test.zip", należy na końcu dodać dokładną nazwę pliku. Na przykład użyj poniższego linku, aby pobrać plik test.zip:

wget -p nazwa_domeny.com/test.zip

pobrać pełną witryny przy użyciu wget --mirror

Poniżej znajduje się wiersz polecenia, które chcesz wykonać, gdy chcesz, aby pobrać pełną stronę internetową i udostępnione do lokalnego przeglądania.

wget --mirror -p --convert-linki -P ./LOCAL-DIR http://www.example.com

  • -mirror: Włącza opcje odpowiednie do tworzenia kopii lustrzanych.

  • -p: pobranie wszystkich plików, które są niezbędne do poprawnego wyświetlenia danej strony HTML.

  • -linek-linków: po pobraniu przekształć łącza w dokumencie do przeglądania lokalnego.

  • -P ./LOCAL-DIR: zapisz wszystkie pliki i katalogi do określonego katalogu

pobrać tylko określonych typów plików Korzystanie wget -r -A

Można to wykorzystać w ramach następujących sytuacjach :

  • Pobierz wszystkie obrazy ze strony internetowej,

  • Pobierz wszystkie pliki wideo z serwisów

  • Pobierz wszystkie pliki PDF ze strony internetowej

wget -r -A.pdf http://example.com/test.pdf

+1

Dzięki. Opcja "--mirror" była tym, co w końcu sprawdziło się w moim przypadku. – vergenzt

+0

jesteś zawsze mile widziany @vergenzt :) –

25

Po pierwsze, aby wyjaśnić pytanie, celem jest pobranie index.html plus wszystkie wymagane części tej strony (obrazy itp.). Opcja -p jest odpowiednikiem --page-requisites.

Powód, dla którego strony nie są zawsze pobierane, jest często hostowany w innej domenie niż strona oryginalna (na przykład CDN). Domyślnie wget refuses to visit other hosts, więc musisz włączyć hosta z opcją --span-hosts z opcją.

wget --page-requisites --span-hosts 'http://www.amazon.com/' 

Jeśli potrzebujesz, aby móc załadować index.html i mieć cały ładunek strona rekwizytów z lokalnej wersji, musisz dodać opcję --convert-links, dzięki czemu adresy URL w img src atrybutów (na przykład) są przepisane na względne adresy URL wskazujące lokalne wersje.

Opcjonalnie możesz również zapisać wszystkie pliki w jednym katalogu „host”, dodając opcję --no-host-directories lub zapisać wszystkie pliki w jednym katalogu, płaskiej dodając opcję --no-directories.

Za pomocą spowoduje, że wiele plików zostanie pobranych do bieżącego katalogu, więc prawdopodobnie chcesz określić nazwę folderu dla plików wyjściowych, używając --directory-prefix.

wget --page-requisites --span-hosts --convert-links --no-directories --directory-prefix=output 'http://www.amazon.com/' 
+0

Dzięki za cenną odpowiedź. Czy możesz dodać dodatkowe informacje, aby uczynić go bardziej ogólnym, zanim będę mógł nagrodzić cię nagrodą. Na przykład: http: // indiabix.com/civil-engineering/questions-and-answer/'pod tym linkiem, chcę, aby wget odwiedzał każdą kategorię/rozdział i pobierał wszystkie obrazy z każdej strony w każdej sekcji (na lewym pasku bocznym).Zauważ, przez obrazy, mam na myśli wszystkie obrazy, w tym obrazy formuł matematycznych zaangażowanych w pytania. * Problem polega na tym, że pobieranie zatrzymuje się po pobraniu pliku index.html. Przykładem dla tego przypadku byłoby świetnie !!! * –

+0

@InsaneCoder Możesz chcieć rozpocząć osobne pytanie i pokazać, co próbujesz, ponieważ rekursywne pobieranie to cały inny zestaw problemów i (jak rozumiem) to) nie jest to, o co pytało pierwotne pytanie. –

+0

@InsaneCoder Dodanie opcji '--mirror' jest najprostsze i może wystarczyć dla twoich potrzeb. –

3

Innym problemem może być to, że strona, którą tworzysz kopię, używa łączy bez numeru www. Więc jeśli podasz

wget -p -r http://www.example.com

nie będzie pobierał żadnych powiązanych (intern) strony, ponieważ są one z „innego” domeny. Jeśli jest to przypadek następnie użyć

wget -p -r http://example.com

zamiast (bez www).

+0

Prawidłowa obserwacja. To jest podstawowa przyczyna mojego problemu. –

0

Jeśli tylko uzyskać index.html i że plik wygląda to zawiera tylko dane binarne (to znaczy nie czytelny tekst, tylko kontrolować znaków), wówczas strona jest prawdopodobnie wysyłania danych za pomocą kompresji gzip.

Możesz to potwierdzić, uruchamiając cat index.html | gunzip, aby sprawdzić, czy wyświetla on czytelny kod HTML.

W takim przypadku funkcja rekurencyjna (-r) nie zadziała. Istnieje patch dla wget do pracy ze skompresowanymi danymi gzip, ale wydaje się, że nie ma jeszcze wersji standardowej.

Powiązane problemy