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.