CURL, aby pobrać katalog

31

Próbuję pobrać pełny katalog witryny za pomocą CURL. Następujące polecenie nie działa:

curl -LO http://example.com/

Zwraca błąd: curl: Remote file name has no length!.

Ale kiedy to robię: curl -LO http://example.com/someFile.type to działa. Jakiś pomysł, jak pobrać wszystkie pliki w określonym katalogu? Dzięki.

Foo
źródło

Odpowiedzi:

30

HTTP nie ma pojęcia o katalogach. Ukośniki inne niż pierwsze trzy ( http://example.com/ ) nie mają żadnego specjalnego znaczenia z wyjątkiem .. w względnych adresach URL. Jeśli serwer nie ma określonego formatu, nie ma możliwości „pobrania wszystkich plików w określonym katalogu”.

Jeśli chcesz pobrać całą witrynę, najlepiej jest rekursywnie przeglądać wszystkie linki na stronie głównej. Curl nie może tego zrobić, ale wget może. Będzie to działać, jeśli strona nie jest zbyt dynamiczna (w szczególności wget nie zobaczy linków zbudowanych za pomocą kodu JavaScript). Zacząć od wget -r http://example.com/i zajrzyj do „Opcji rekurencyjnego pobierania” i „Akceptuj / Odrzuć rekurencyjne” w podręczniku wget, aby uzyskać więcej odpowiednich opcji (głębokość rekurencji, listy wykluczeń itp.).

Jeśli witryna próbuje zablokować automatyczne pobieranie, może być konieczna zmiana ciągu agenta użytkownika ( -U Mozilla ) i ignorować robots.txt (utwórz pusty plik example.com/robots.txt i użyj -nc opcja, aby wget nie próbował pobrać go z serwera).

Gilles
źródło
Jak wget jest w stanie to zrobić. ??
Srikan
@Srikan wget analizuje kod HTML, aby znaleźć linki, które zawiera i rekurencyjnie pobiera (zaznacza) te linki.
Gilles
Jeśli pliki nie mają żadnych łączy wewnętrznych, pobieranie rekursywne nie powoduje pobrania wszystkich plików. Powiedzmy, że istnieje folder HTTP niektórych plików txt. Czy wget uda się pobrać wszystkie pliki. Pozwól mi spróbować po tym komentarzu
Srikan
@Srikan HTTP nie ma pojęcia katalogu. Pobieranie cykliczne oznacza następujące linki na stronach internetowych (w tym strony internetowe generowane przez serwer w celu wyświetlenia listy katalogów, jeśli serwer WWW to robi ).
Gilles
wget obsługuje ignorowanie robots.txt za pomocą flagi -e robots=off. Alternatywnie możesz uniknąć pobierania go, odrzucając go -R "robots.txt".
Ryan Krage
22

Zawsze działa dla mnie, nie zawiera elementu nadrzędnego i rekurencyjnego, aby uzyskać tylko żądany katalog.

 wget --no-parent -r http://WEBSITE.com/DIRECTORY
stanzheng
źródło
12

W tym przypadku, curl NIE jest najlepszym narzędziem. Możesz użyć wget z -r argument taki jak ten:

wget -r http://example.com/ 

Jest to najbardziej podstawowa forma i możesz również użyć dodatkowych argumentów. Aby uzyskać więcej informacji, zobacz manpage ( man wget ).

moroccan
źródło
5

To nie jest możliwe. Nie ma standardowego, ogólnie zaimplementowanego sposobu, aby serwer WWW zwracał zawartość katalogu do ciebie. Większość serwerów generuje indeks HTML katalogu, jeśli jest do tego skonfigurowany, ale to wyjście nie jest standardowe ani nie jest gwarantowane w żaden sposób. Możesz przetworzyć ten HTML, ale pamiętaj, że format zmieni się z serwera na serwer i nie zawsze będzie włączony.

Brad
źródło
Spójrz na tę aplikację o nazwie Site Sucker. siteucker.us . Jak oni to robią?
Foo
Analizują plik HTML i pobierają każdy znajdujący się w nim link.
Brad
Za pomocą wget lub curl?
Foo
7
@Brad: curl nie analizuje kodu HTML, ale wget robi dokładnie to (nazywane jest odzyskiwaniem rekurencyjnym).
Gilles
1
Ach, cóż, ja poprawiam! gnu.org/software/wget/manual/html_node/… OP powinien mieć świadomość, że nadal nie dostaje tego, czego szuka ... podąża tylko za linkami dostępnymi na zwróconych stronach.
Brad
2

Możesz użyć rozszerzenia Firefox DownThemAll! Pozwoli ci pobrać wszystkie pliki z katalogu jednym kliknięciem. Jest również konfigurowalny i możesz określić typy plików do pobrania. To najłatwiejszy sposób, jaki znalazłem.

Asdf
źródło
0

Możesz znaleźć zastosowanie do rippera strony tutaj, to pobierze wszystko i zmodyfikuje zawartość / linki wewnętrzne do użytku lokalnego. Dobry znajdziesz tutaj: http://www.httrack.com

Gaurav Joseph
źródło