Wget – narzędzie do ściągania plików z internetu. Obsługuje protokoły HTTP, HTTPS oraz FTP. Jest to bardzo wygodne narzędzie, które ma olbrzymią ilość różnych opcji. Większości spośród tych przełączników nie używa się podczas normalnej eksploatacji programu. W poniższym artykule postaram się wyjaśnić działanie najbardziej przydatnych opcji a następnie pokazać kilka przykładów radzenia sobie z bardziej “wymagającymi” stronami.

wget

Na początek ogólna składnia:

wget opcje adres

Najważniejsze opcje (podane w parach: forma krótka i długa, należy wybrać jedną z nich):

-c , –continue

Opcja ta służy do kontynuowania pobierania pliku, który już znajduje się w folderze pobierania. Funkcja ta jest szczególnie przydatna przy pobieraniu dużych plików. Jeśli próbujemy ściągnąć inny plik, ale o tej samej nazwie co już istniejący, możemy napotkać następujące sytuacje:

  • plik ściągany jest większy od posiadanego – wtedy część pliku ściąganego dopisze się na końcu posiadanego, tworząc coś, co nie zawsze da się otworzyć
  • plik ściągany jest mniejszy od posiadanego – wtedy wget będzie próbował pobrać dalszą część pliku, ale będzie szukał czegoś, co nie istnieje i podejmie kilka nieudanych prób (które po prostu trwają, ale nic nie pobierają)
  • jeśli serwer z którego ściągamy jest skonfigurowany tak, że nie podaje informacji o wielkości pobieranego pliku, to zazwyczaj plik starszy zostanie nadpisany nowszym.

-b , –background

Cały proces pobierania zostanie przeniesiony w tło i nie przerwie go nawet zamknięcie konsoli w której uruchomiliśmy ściąganie. Informacje o postępie pobierania zapisywane są w pliku “wget-log”, a jeśli taki istnieje, to w pliku “wget-log.#”, gdzie “#” jest kolejnym numerem. Możemy oczywiście samodzielnie zdefiniować nazwę pliku, w którym zapisywany jest postęp pobierania za pomocą opcji “-o plik.log” lub za pomocą opcji “-a plik.log”. Obie opcje powodują zapisywanie wyjścia programu w pliku “plik.log”, różnica jest taka, że opcja “-o plik.log” powoduje, że istniejący “plik.log” jest nadpisywany, zaś opcja “-a plik.log” nakazuje programowi kontynuować istniejący plik.

-m , –mirror

Opcja powoduje, że ściągamy zawartość wskazanej witryny wraz z zachowaniem struktury katalogów. Jeśli w ten sposób chcemy pobrać pojedynczy plik – zastanie on zapisany wraz ze strukturą katalogów. Przykłady:

wget -m http://osworld.pl

W tej sytuacji program pobierze zawartość całej witryny osworld.pl i zapisze ją w folderze ./osworld.pl

wget -m http://osworld.pl/wp-content/uploads/osworld-logo-ikonka.png

W tej sytuacji program pobierze plik osworld-logo-ikonka.png i zapisze go w folderze ./osworld.pl/wp-content/uploads/

-np , –no-parent

Podczas pobierania program nie będzie próbował ściągać nic, co znajduje się w innym katalogu niż ten podany w adresie. Przykład:

wget -m -np http://osworld.pl/blog/

W tym przykładzie program pobierze wszystko, co znajduje się na serwerze w folderze osworld.pl/blog/, nie pobierze nic ponadto.

-i plik , –input-file=plik

Opcji tej używa się gdy jest spora lista adresów zapisana w pliku na dysku. Wszystkie adresy są pobierane po kolei zgodnie z opcjami podanymi w linii poleceń.

-O plik , –output-document=plik

Zapisuje pobrany dokument w podanym pliku, jednocześnie zastępując go. Jeśli ściągamy więcej niż jeden plik, to wszystko, co zostanie ściągnięte będzie zapisane w jednym pliku.

-A wzorzec , –accept wzorzec

Powoduje, że podczas pobierania na dysku zapisywane są tylko pliki pasujące do wzorca (choć pobierane są wszystkie pliki). Jeśli we wzorcu zostanie użyty chociaż jeden ze znaków: “*”, “?”, “[” lub “]”, wtedy dopasowanie do wzorca będzie zgodne z podanym wyrażeniem regularnym. W przeciwnym wypadku podany wzorzec jest traktowany jako rozszerzenie pliku (czyli to, co w pliku znajduje się po kropce). Można podać więcej niż jeden wzorzec, znakiem rozdzielającym jest przecinek. Przykład:

wget -m -A jpg,*potkani* http://osworld.pl

Zapisze na dysku pliki z rozszerzeniem “jpg” (czyli *.jpg) i pliki, w których nazwie występuje człon “potkani” (czyli *potkani*).

-R wzorzec , –reject wzorzec

Powoduje, że nie pobierane są pliki pasujące do wzorca. Jeśli we wzorcu zostanie użyty chociaż jeden ze znaków: “*”, “?”, “[” lub “]”, wtedy dopasowanie do wzorca będzie zgodne z podanym wyrażeniem regularnym. W przeciwnym wypadku podany wzorzec jest traktowany jako rozszerzenie pliku (czyli to, co w pliku znajduje się po kropce). Można podać więcej niż jeden wzorzec, znakiem rozdzielającym jest przecinek. Przykład:

wget -m -R jpg,*potkani* http://osworld.pl

Nie pobierze plików z rozszerzeniem “jpg” (czyli *.jpg) i pliki, w których nazwie występuje człon “potkani” (czyli *potkani*).

-X lista , –exclude-directories=lista

Podane w tej opcji katalogi nie zostaną w ogóle pobrane. Przykład:

wget -m -X spotkania http://osworld.pl

Nie pobierze niczego, co znajduje się na serwerze w folderze spotkania.

-l liczba , –level=liczba

Ogranicza liczbę ściąganych podstron do podanej przy tej opcji.

Przykłady podstawowego użycia wget

Pobranie pojedynczego pliku:

wget http://strona.pl/plik

Pobranie pojedynczego pliku i zapisanie go jako “sciagniety_plik”:

wget http://strona.pl/plik -O sciagniety_plik

Pobranie wszystkiego co znajduje się na stronie (mirror strony):

wget -m -b -c http://strona.pl

Jeśli chcemy pobrać jakąś stronę, ale tylko konkretny folder i nie chcemy, aby wget ściągnął cokolwiek spoza tego folderu, a status pobierania zapisywał w pliku “log”, wpisujemy:

wget -m -np -b -c http://strona.pl/folder -o log

Jeśli chcemy, aby wget pobrał stronę wraz z obrazkami i wszystkimi plikami, do których prowadzi ściągana strona:

wget -m -b -c http://strona.pl -l 1

Jednak wiele stron jest zabezpieczonych przed masowym pobieraniem. W takim przypadku wget także nieźle daje sobie radę. Czasami z naszą pomocą, czasami zaś z pomocą prostego skryptu. Poniżej kilka przykładów omijania takich zabezpieczeń.

Przykłady zaawansowanego użycia wget

1. Serwer wymaga logowania

Jeśli strona, z której pragniemy ściągać wymaga logowania, to można je wykonać na kilka sposobów. Najbardziej popularny:

wget -m -b -c http://login:hasło@strona.pl

Sposób ten nie zawsze zadziała. W takich wypadkach czasami trzeba trochę pokombinować. Tutaj niestety przyda nam się przeglądarka z obsługą plików cookies w formacie Netscape (np. Seamonkey). Za pomocą przeglądarki wchodzimy na stronę, logujemy się, zaznaczając na stronie logowania opcję zapamiętywania użytkownika. Znajdujemy na dysku twardym plik cookies naszej przeglądarki i wykonujemy:

wget -m -b -c http://strona.pl --load-cookies=/ścieżka/do/pliku/cookies.txt

2. Folder bf-analyze

Niektóre strony chronią obrazki na nich zawarte przed masowym ściąganiem za pomocą mechanizmu, który można rozpoznać widząc w linku do pliku folder “bf-analyze”. Przykładem tutaj może być obrazek http://www.freeduino.org/bf-analyze/images/freeduino_maxserial_500.jpg. Ze zwykłej przeglądarki widzimy obrazek, jednak, jeśli wywołamy wgeta:

wget -m -b -c http://www.freeduino.org/bf-analyze/images/freeduino_maxserial_500.jpg

Dowiemy się, że “BŁĄD 404: Not Found.”. Dziwne, ale jeśli usuniemy z adresu folder “bf-analyze”, to obrazek daje się ściągnąć:

wget -m -b -c http://www.freeduino.org/images/freeduino_maxserial_500.jpg

Niestety sam wget tutaj nie da sobie rady, ale można zrobić prosty skrypt, który najpierw pobierze wszystkie strony, później wyszuka w nich linki do plików w folderze bf-analyze, a później przerobi linki w ten sposób aby wycinały tekst “bf-analyze/”

3. Serwisy zabezpieczone przed szybkim pobieraniem

Niektóre strony zabezpieczone są skryptem, który blokuje dostęp dla IP, jeśli wykryje zbyt szybkie pobieranie jednego pliku za drugim. W takich wypadkach przydają się opcje “-w sekundy” i “–random-wait”. Pierwsza powoduje, że między kolejnymi próbami pobierania minie określona liczba sekund, druga zaś, że czas ten będzie trochę bardziej losowy. Przykład wywołania:

wget -w 10 --random-wait -m -b -c http://strona.pl

W takim wypadku kolejne pliki będą ściągane w odstępach losowych z zakresu 5-15 sekund.

4. Plik robots.txt blokujący wgeta

Plik robots.txt na serwerze służy do ograniczenia działania programów ściągających. Zazwyczaj znajdują się w nim informacje, które przeglądarki są zabronione i które foldery są wyłączone z pobierania automatycznego. Niestety, wget jest często wymieniony jako zabroniony. Możemy sobie z tym poradzić za pomocą opcji -U, która zmienia sposób w jaki nasz wget przedstawia się serwerowi:

wget -U "jestem drzewem" -m -b -c http://strona.pl

Jeśli ktoś przejrzy logi to oczywiście natrafi na dziwną identyfikację i może się zdenerwować. Dlatego warto wstawić linię jaką podaje inna przeglądarka. Pod adresem http://www.useragentstring.com/pages/Browserlist/ znajduje się spory wybór takich danych identyfikacyjnych. Niestety, czasami to nie wystarcza, bo w pliku robots.txt zablokowane jest automatyczne pobieranie ze wszystkich folderów. W takim wypadku można wyłączyć obsługę tego pliku, ale nie jest to zalecane i w zasadzie lepiej unikać takiego działania. Jeśli mimo wszystko musimy ściągnąć stronę, to wpisujemy:

wget -e robots=off -m http://strona.pl

Oczywiście wtedy koniecznie użyjmy pozostałych wcześniej wymienionych sposobów ukrywania wgeta.

5. Zabezpieczenie “proszę czekać”

Czasami, gdy próbujemy pobrać stronę, to zamiast niej pobieramy pustą stronę, czasami z informacją w stylu “proszę czekać”. Jest to dość proste zabezpieczenie, ale ostatnio coraz bardziej popularne i skutecznie blokujące pobieranie automatyczne. Mechanizm ten zazwyczaj (wyjątkiem są mechanizmy oparte na JavaScript, ale tego niestety wget jeszcze nie obsługuje) daje się oszukać poprzez dwukrotne podanie linka w wywołaniu wgeta:

wget http://strona.pl/plik http://strona.pl/plik

Niestety, można w ten sposób pobrać tylko pojedynczy plik, ale dzięki skryptom Bash łatwo ominąć ten problem.

  • Razi

    wgetem można też ściągać radia i transmisje video :) Ale nie wiedziałem że i witryny pobiera, zawsze do tego WebHTTracka używałem.

    • Gerard Stańczak

      WebHTTrack poza tym że działał mi dość niestabilnie to rzadko kiedy pobierał z pełną prędkością łącza (nie wiem czy tylko w moim przypadku). Dużo bardziej mogę polecić WinWget jako graficzny frontend dla wgeta. Albo jeszcze lepiej – cygwin a w nim wget dopełniony skryptami bash =)

    • Razi

      Pracuję pod Linuksem, konsola mi nie straszna, zwłaszcza w Dolphinie :) nie wiem jak na Windowsie, ale tu WebHTTrack ma interfejs webowy i działa stabilnie

    • arek

      Wgeta odpalisz w skrypcie.

  • missssiiiiuuu

    Bardzo mi się podoba ten konkurs ze względu na dodatkową ilość tutoriali które często gęsto są początkującym potrzebne. Nieskromnie przyznam, że póki co, żaden mi się nie przydał aleeeee pochwalam akcje w 100%. Pamiętam początki ubucentrum i ilość ciekawych programów które dzięki temu blogowi odkryłem. Mam nadzieje, że tutaj stworzy się prawdziwa grupa ludzi, którzy regularnie będą coś pisać.
    P.S.
    Marzy mi się tez powrót heise-online.pl aleeeeee pomarzyć zawsze warto. Widziałem, że raz na jakiś czas ktoś tam od nich coś schreibnie i choć tak naprawdę rozumie tylko tyle, że to jest napisane po polsku to fajnie byłoby wiedzieć coś więcej na temat tego co się w środku kernela dzieje. Dla mnie jesteście ostatnim prawdziwym bastionem linucha w polskim internecie, więc proszę niech wam "gwizdek z czasem nie opadnie"
    POZDRAWIAM!

    • Artur Głowacki

      Nie bój się. Chłopaki z OSWorld.pl na pewno nie stracą pary. Zresztą w sumie tylko ich czytam bo czasem wpadają naprawdę konkretne artryukły (i na takie czekam), a inni czekają na kursy dla początkujących. Zresztą zawsze jak chcesz możesz do nich zgłosić się na szkolenie. Ja byłem na jednym i polecam.

      Swoją drogą curl też ciekawe narzędzie i potrafi więcej niż wget :)

    • arek

      Curl do ściągania? Potrafi więcej niż wget?
      Hmmm.
      A przypadkiem nie wykorzystuje się go do czegoś innego?
      Myślę, że podobnym byłoby porównanie ‘grep jest o wiele lepszy niż cat’.

    • Anters

      curl do ściągania jak najbardziej. Sporo aplikacji działa dzięki niemu np. apt-get. Porównanie grepa do cata jest głupie.

  • Pingback: Casestudy – cykliczne pobieranie obrazków z serwisu Tumblr | OSWorld.pl()