Superściągacz

Programy do "ściągania" na dysk całych witryn WWW (takie jak chociażby Teleport Pro) były opisywane w MI już niejednokrotnie. Program wget, o którym traktuje niniejszy tekst, różnią jednak od dotychczas opisywanych dwie istotne cechy. Po pierwsze, przeznaczony jest do pracy w środowisku Unixowym; po drugie - po wstępnym określeniu, co i w jaki sposób należy pobierać, pracuje w sposób w pełni autonomiczny, bez interakcji z użytkownikiem, który może nawet zakończyć sesję i odłączyć się od serwera.

Rzecz jasna, aby skorzystać z takiego programu, trzeba posiadać na jakimś serwerze tzw. "pełne" konto (umożliwiające dostęp do shella, czyli linii poleceń systemu Unix) - popularne konta przeznaczone tylko do poczty nie wystarczą. Jeżeli jednak mamy już takie konto, możemy przy pomocy wget-a ściągać pliki z sieci w sposób niezwykle "przyjazny dla kieszeni". W odróżnieniu bowiem od programów działających na lokalnym komputerze, gdzie trzeba przez cały czas "ściągania" być on-line, tu wystarczy połączyć się z providerem, zainicjować pracę programu na swoim koncie na serwerze, po czym... rozłączyć się i pójść spać. Przez noc program zrobi swoje, a rano ściągniętą witrynę możemy już z pełną szybkością, na jaką pozwala nasz modem, unikając opóźnień w sieci (które ostatnimi czasy, zwłaszcza przy dostępie do witryn zagranicznych, przybierają horrendalne wielkości), przetransmitować na własny dysk.

Na wielu serwerach Unixowych program wget jest już zainstalowany przez administratora, tak więc nie potrzeba żadnych dodatkowych zabiegów, aby się nim posługiwać. Jeżeli natomiast na serwerze, na którym mamy konto, tego programu jeszcze nie ma, spróbujmy nakłonić administratora do jego zainstalowania; gdy zaś to się nie uda - można spróbować go zainstalować samodzielnie, co nie jest wcale takie trudne (sposób instalacji programu omówiony jest dokładniej pod koniec artykułu).

Co potrafi wget

Wget jest narzędziem bardzo uniwersalnym i jego zastosowania nie sprowadzają się tylko do pobierania całych witryn. Znakomicie sprawdza się m.in. przy ściąganiu pojedynczych, długich plików udostępnianych na serwerach WWW (np. oprogramowania). Wśród webmasterów stał się ostatnio "modny" dość irytujący zwyczaj udostępniania plików do pobrania poprzez protokół HTTP zamiast FTP. W warunkach obciążonej sieci ściągnięcie takiego pliku jest nie lada problemem: w przeciwieństwie do FTP, specjalnie zaprojektowanego do długotrwałych i wolnych transmisji, HTTP nie spisuje się w takich zastosowaniach zbyt dobrze. Stąd też ściąganie dłuższych plików często ulega przerwaniu. W takiej sytuacji nieoceniony jest właśnie wget: oprócz tego, że transmisja zrywa się w nim znacznie rzadziej niż w przeglądarce (długi domyślny czas oczekiwania, tzw. timeout), to w przypadku jej zerwania program wielokrotnie, "do skutku" powtarza próby ściągnięcia przerwanego pliku. Jeżeli serwer, z którym się łączymy, pozwala na przesyłanie fragmentów plików (nagłówek "Range:" protokołu HTTP 1.1), transmisja jest przy tym automatycznie kontynuowana od miejsca, w którym została przerwana. Można skorzystać z tego udogodnienia także w przypadku, gdy plik wcześniej ściągany był przy pomocy innego programu (np. przeglądarki) i transmisja uległa zerwaniu - jeżeli tylko częściowo przetransmitowany plik znajduje się na dysku (czasami po przerwaniu transmisji przeglądarki go kasują), wget, zamiast ściągać go od nowa, potrafi doczytać jedynie brakującą część.

Program umożliwia pobieranie nie tylko stron publicznie dostępnych, ale także wymagających podania nazwy użytkownika i hasła. W przypadku gdy serwis nie stosuje standardowego zapytania o nazwę i hasło, lecz identyfikuje użytkownika poprzez ustawienie odpowiedniego "ciastka" w przeglądarce, wykorzystanie wget-a również jest możliwe, choć wymaga nieco dodatkowych zabiegów. Program pozwala na umieszczenie w żądaniu wysyłanym do serwera dowolnych dodatkowych nagłówków HTTP, trzeba więc odnaleźć właściwe "ciastko" w pliku cookies.txt przeglądarki i skopiować je do tego dodatkowego nagłówka (por. artykuł Tomasza Tatara w MI 1/98 dokładniej omawiający technikę "ciastek").

Równie dobrze, co z serwerami WWW, program może współpracować z serwerami FTP. Oczywiście i tu dostępne są te same udogodnienia, takie jak wznawianie transmisji pliku od miejsca przerwania dla serwerów, które na to pozwalają (akceptują komendę REST), bądź możliwość podania nazwy użytkownika i hasła dla ściągania plików z prywatnych katalogów. Obsługiwana jest możliwość pracy poprzez serwery proxy i firewalle dla obydwu typów protokołów.

Najciekawsze możliwości programu wiążą się rzecz jasna ze ściąganiem całych witryn WWW. Tu dysponujemy szeregiem opcji pozwalających na różne sposoby kontrolować "zasięg" pobierania plików przez program. Podstawowym mechanizmem jest możliwość ustalenia poziomu, na jaki program ma się zagłębiać w przeglądaną witrynę; domyślny poziom wynosi 5, to znaczy ściągane będą pliki znajdujące się o co najwyżej 5 kolejnych odsyłaczy od strony początkowej. Odsyłacze te niekoniecznie muszą prowadzić "niżej" w hierarchii katalogów serwera, co może powodować pewne problemy: jeżeli interesuje nas tylko określony fragment jakiegoś serwisu (np. konkretna strona prywatna na serwerze takim jak free.polbox.pl), a znajduje się tam odsyłacz do strony głównej serwera, program przejdzie za tym odsyłaczem i pobierze także stronę główną oraz wszystkie inne, do których prowadzą z niej odsyłacze, czyli de facto cały serwis (aż do ustalonej głębokości) - dużo więcej, niż chcieliśmy! Dla uniknięcia takich sytuacji mamy do dyspozycji opcję zabraniającą programowi "wychodzenia" do katalogów położonych w drzewie katalogów serwera powyżej strony początkowej. Można również bezpośrednio określić listę nazw katalogów, z których programowi wolno lub nie wolno ściągać plików.

Domyślnie program interesuje się jedynie stronami położonymi na tym samym serwerze; strony z innych serwerów, do których odsyłacze zostaną znalezione na przeglądanej witrynie, nie są pobierane. Możemy jednak zmienić to zachowanie, gdy np. witryna, której zawartość chcemy pobrać, rozlokowana jest na kilku serwerach. Zezwalając programowi na pobieranie stron z innych serwerów, możemy ograniczyć zasięg jego działania tylko do określonej domeny lub domen; możemy też określić adresy domenowe, z których program ma nie pobierać plików. Wreszcie można ograniczyć działanie programu tylko do określonych typów plików (przykładowo, interesuje nas ściągnięcie tylko grafik zawartych na stronie, a więc plików typu .gif i .jpg), albo wręcz do nazw plików pasujących do określonego wzorca, jak również na odwrót - wykluczyć ściąganie określonych typów czy nazw plików (np. aby ściągnąć stronę bez towarzyszących jej filmów czy plików dźwiękowych). Dodatkowo możemy nakazać programowi pobieranie plików dostępnych przez FTP, do których odsyłacze znajdują się na stronach (normalnie wget nie próbuje ich ściągać).

Jeżeli mamy już na dysku część plików interesującej nas witryny lub jej wcześniejszą wersję, możemy nakazać programowi pobranie z serwera tylko tych plików, których nie ma na dysku lub które zostały zaktualizowane w stosunku do posiadanej przez nas wersji. Czyni to z wget-a wygodne narzędzie do tworzenia regularnie, automatycznie aktualizowanych kopii witryn WWW lub katalogów serwerów FTP (tzw. mirrorów) - wystarczy tylko umieścić wywołanie wget-a w systemowym mechanizmie cron Unixa, pozwalającym na automatyczne uruchamianie programów w określonych dniach i godzinach. Inną oryginalną możliwością programu jest działanie w trybie "spider", w którym program nie ściąga na dysk żadnych plików, a jedynie sprawdza, czy dokumenty, do których prowadzą odsyłacze, istnieją. "Przepuszczenie" przez program działający w tym trybie swojej witryny WWW czy pliku zakładek może być zatem znakomitym sposobem sprawdzenia, czy wszystkie adresy nadal są aktualne.

Przykłady

Tego bardzo atrakcyjnie brzmiącego omówienia możliwości programu nie mogę niestety zilustrować równie efektownymi zrzutami ekranów, pokazującymi program w działaniu. Wget bowiem jest przedstawicielem "starej szkoły" oprogramowania Unixowego - programów, których potężne możliwości kryją się pod zupełnie nieefektownym interfejsem użytkownika. Wget pracuje "wsadowo", to znaczy bez dialogu z użytkownikiem: sposób jego działania jest całkowicie określany parametrami podanymi przy wywołaniu programu oraz zawartością pliku konfiguracyjnego. Dzięki temu jednak właśnie jest możliwe pozostawienie programu po uruchomieniu "samemu sobie". Myślę, że ta zaleta całkowicie rekompensuje konieczność nauczenia się sposobu wywoływania programu, który wcale nie jest taki trudny.

Najprościej jest, gdy chcemy ściągnąć za pomocą wget-a pojedynczy plik. Piszemy po prostu wget i adres URL interesującego nas pliku, na przykład:

     wget http://officeupdate.microsoft.com/downloaditems/Wd97cnv.exe &
Znak "&" na końcu komendy jest sygnałem dla Unixa, że program ma być uruchomiony w tle, a my chcemy mieć możliwość dalszej pracy lub wylogowania się (w przeciwnym razie musielibyśmy czekać, aż program zakończy działanie, a zwykle nie o to nam chodzi). Ściągnięty plik - w tym przypadku Wd97cnv.exe - zostanie umieszczony w bieżącym katalogu. Podczas pobierania pliku program będzie wypisywał na ekran mnóstwo komunikatów, informujących o aktualnym zaawansowaniu procesu. Może to przeszkadzać w dalszej pracy, dlatego też uruchamiając program możemy podać w komendzie dodatkowy parametr -q, wyłączający całkowicie wypisywanie jakichkolwiek komunikatów, bądź parametr -nv, ograniczający komunikaty do najistotniejszych (np. o niemożliwości nawiązania połączenia lub jego zerwaniu). W identyczny sposób można też ściągać pliki z serwerów FTP, podając adres zaczynający się od "ftp://" zamiast "http://".

Chcąc ściągnąć całą witrynę, używamy dodatkowego parametru -r; przykładowo, polecenie

     wget -r http://polska.pl/ &
ściągnie całą zawartość witryny polska.pl (do 5 poziomów w głąb). W tym przypadku w bieżącym katalogu zostanie utworzony podkatalog o nazwie identycznej z adresem serwera, z którego pobieramy pliki, a więc polska.pl, i dopiero w nim umieszczone będą ściągnięte pliki i podkatalogi. Chcąc uniknąć tworzenia tego dodatkowego katalogu, możemy dodać do komendy parametr -nH (pamiętajmy o rozróżnianiu przez Unix dużych i małych liter!), wówczas katalog ten nie będzie tworzony, a pliki i podkatalogi ściągnięte z witryny znajdą się bezpośrednio w katalogu bieżącym.

Przy ściąganiu całej witryny należy zwrócić uwagę na to, w jaki sposób poszczególne strony odwołują się nawzajem do siebie. Jeżeli używane są odsyłacze względne (nie zawierające adresu serwera) - tak jak we wspomnianej witrynie polska.pl - będą one prawidłowo działać na lokalnym dysku. Jeżeli jednak wykorzystywane są odsyłacze bezwzględne, zawierające pełne adresy URL, kliknięcie na odsyłacz w ściągniętym pliku prowadzić nas będzie do sieci, zamiast do strony na dysku! W takiej sytuacji wskazane jest podanie w komendzie uruchamiającej program jeszcze parametru -k, nakazującego programowi dokonanie odpowiedniej zamiany odsyłaczy bezwzględnych na względne.

Jeżeli chcemy ściągnąć pojedynczą stronę, ale wraz ze znajdującymi się na niej grafikami, również musimy użyć opcji -r. W tym przypadku jednak ograniczymy poziom zagłębiania się w witrynę do 1, a interesujące nas typy plików do .jpg i .gif:

     wget -r -l1 -A.jpg,.gif http://www.mi.com.pl/ &
Powyższe polecenie ściągnie główną stronę internetowej witryny MI wraz ze wszystkimi znajdującymi się na niej grafikami, ale pominie wszystkie strony podrzędne. Analogicznie, za pomocą parametru -R możemy wykluczyć z obszaru naszego zainteresowania określone typy lub nazwy plików (np. gdy ściągamy witrynę zawierającą odsyłacze do filmów .mpg lub .avi, pominięcie tych plików jest wysoce wskazane).

Spróbujmy teraz ściągnąć tylko określony fragment serwisu. Załóżmy, że interesuje nas np. Polska Strona Ogonkowa, znajdująca się na serwerze AGH w Krakowie, ale nie chcemy, aby program przy jej ściąganiu przeszedł po znajdującym się tam odsyłaczu do głównej strony serwera i ściągnął także inne, nie związane z tematem strony. Używamy parametru -np:

     wget -r -np http://www.agh.edu.pl/ogonki/ &
(w starszych wersjach programu zamiast -np trzeba napisać --no-parent). Użycie tego parametru zabezpiecza przed pobraniem z serwera jakichkolwiek plików nie znajdujących się w katalogu /ogonki lub jego podkatalogach. Możemy spotkać się jednak z sytuacją, że strony znajdujące się w określonym katalogu wykorzystują grafiki znajdujące się w zupełnie odrębnym katalogu na serwerze (np. przewodnik po Tatrach znajdujący się na serwerze krakowskiego Cyfronetu - http://www.cyf-kr.edu.pl/przewT/, który korzysta z grafik w katalogach /gifs i /ikony). Aby ściągnąć również i te grafiki, trzeba, zamiast używać opcji -np, jawnie określić nazwy katalogów, z których program może ściągać pliki:

     wget -r -I/przewT,/gifs,/ikony http://www.cyf-kr.edu.pl/przewT/ &
Jak widać, nazwy te określa się przy pomocy parametru -I (zwróćmy uwagę, że trzeba w nim wymienić również katalog /przewT, w przeciwnym razie nie zostanie ściągnięty z niego żaden plik oprócz początkowej strony!). Odwrotne znaczenie ma parametr -X - określa katalogi, do których programowi nie wolno wchodzić.

Gdy chcemy ściągnąć pliki z więcej niż jednego serwera naraz, używamy parametru -H. Razem z nim zwykle podaje się parametr -D, określający zakres dopuszczalnych nazw domen (w przeciwnym wypadku bowiem program mógłby zacząć ściągać... całą sieć - niechby na którejś ze stron trafił się np. odsyłacz do www.yahoo.com!). Spróbujmy ściągnąć początkowe strony wszystkich serwerów firmy TopNet:

     wget -r -l3 -H -Dtop.pl -k http://www.top.pl/ &
Z uwagi na dużą liczbę plików ograniczyliśmy głębokość ściągania witryn do 3, wskazując równocześnie, że program ma podążać za wszystkimi odsyłaczami do innych serwerów w domenie top.pl. Bardzo istotne jest w takim przypadku podanie wspomnianego już parametru -k, dzięki któremu odsyłacze prowadzące oryginalnie pomiędzy różnymi serwerami będą poprawnie działać na lokalnym dysku.

Warto jeszcze zwrócić uwagę na jeden istotny fakt: jak zostało już powiedziane, domyślnie program ściąga tylko pliki znajdujące się na tym samym serwerze. Identyczność serwerów jest jednak określana na podstawie adresu IP, a nie adresu domenowego, jako że ten sam komputer, mający ten sam adres IP, może mieć wiele nazw domenowych (np. www.cyfronet.krakow.pl, www.cyf-kr.edu.pl i kinga.cyf-kr.edu.pl to jeden i ten sam serwer). Może to jednak prowadzić do problemów w przypadku coraz popularniejszych obecnie serwerów wirtualnych, zlokalizowanych na tym samym komputerze i mających ten sam adres IP, a różniących się tylko adresem domenowym. Z sytuacją taką mamy np. do czynienia w przypadku witryny naszego magazynu: adres www.mi.com.pl odpowiada temu samemu numerowi IP, co www.polbox.pl, choć wpisanie każdego z tych adresów w przeglądarce zaprezentuje nam zupełnie inne strony. Ponieważ zaś na głównej stronie witryny MI znajduje się odsyłacz do http://www.polbox.pl/, przy próbie ściągnięcia jej za pomocą wget-a, program ściągnąłby, idąc za tym odsyłaczem, również całą zawartość serwera www.polbox.pl (oczywiście do ustalonej głębokości). Jest to oczywiście sytuacja niepożądana; możemy jej zapobiec dodając do komendy wywołania programu parametr -nh - wówczas program nie będzie usiłował sprawdzać adresów IP serwerów, poprzestając jedynie na porównaniu nazw domenowych (przyspiesza to również pracę programu w przypadku ściągania stron zawierających wiele odsyłaczy do różnych serwerów - program nie musi sprawdzać numeru IP dla każdego adresu). Opcja ta może być też określona jako domyślna w pliku konfiguracyjnym programu.

Program wget ma oczywiście znacznie więcej możliwości i parametrów wywołania; tu przedstawiłem tylko przykłady najczęściej spotykane w praktyce przeciętnego użytkownika. Dokładniejszy opis można znaleźć w instrukcji obsługi programu, która powinna być dostępna po wydaniu komendy man wget. W przypadku najnowszych wersji programu komenda ta może nie działać; instrukcja przygotowana bowiem została w nowym standardzie plików pomocy, obsługiwanym przez program o nazwie info (trzeba zatem wydać komendę: info wget). Sęk w tym, że program info niekoniecznie musi być na danym komputerze zainstalowany, gdyż nie jest on standardowym elementem Unixa... W takim przypadku pozostaje "ręczne" przeglądanie plików pomocy (o ile w ogóle zostały one zainstalowane) przy użyciu Unixowej komendy more:

     more /usr/local/info/wget.info-1
Krótki wykaz akceptowanych przez program parametrów można również uzyskać wydając komendę wget --help.

Instalacja

Teraz pora na obiecany opis samodzielnej instalacji wget-a, gdy nie jest on zainstalowany na serwerze. Najpierw trzeba ściągnąć program z sieci; wget dostępny jest w dowolnym mirrorze archiwum GNU, np. ftp://sunsite.icm.edu.pl/pub/gnu/. W chwili pisania tego artykułu aktualna wersja wget-a nosi numer 1.5.3, tak więc interesujący nas plik to wget-1.5.3.tar.gz (gdy zmieni się numer wersji programu, odpowiednio ulegnie zmianie także i nazwa pliku).

Jak wskazuje podwójne rozszerzenie .tar.gz, jest to plik spakowany za pomocą Unixowych programów tar i gzip. Pierwszą czynnością będzie zatem rozpakowanie go; w tym celu musimy wypisać chyba najbardziej skomplikowaną komendę w całym procesie instalacji:

     gunzip -c wget-1.5.3.tar.gz | tar xvf -
W tym momencie może się niestety okazać, że na naszym serwerze nie ma programu gunzip (również nie jest on standardową komendą Unixa), co system zasygnalizuje nam komunikatem gunzip: not found. Jest to wprawdzie dość mało prawdopodobne, gdyż obecnie większość oprogramowania dla Unixa rozpowszechniana jest w formacie .tar.gz, zatem administrator musi posiadać ten program, aby móc cokolwiek instalować; może on jednak być niedostępny dla użytkowników. W takiej sytuacji chyba nie obejdzie się bez rozmowy z administratorem...

Zakładając jednak, że proces rozpakowania przebiegł bez przeszkód, w bieżącym katalogu powinien pojawić się podkatalog o nazwie wget-1.5.3, zawierający rozpakowane pliki. Spakowany plik .tar.gz możemy już w tym momencie skasować (robi się to komendą rm), aby zaoszczędzić miejsce na dysku, gdyż proces instalacji potrzebuje go około 2 MB. Następnie wchodzimy do utworzonego katalogu (komendą cd, analogicznie jak w DOS-ie) i zgodnie z typową procedurą instalacji oprogramowania Unixowego, rozpoczynamy od uruchomienia programu:

     configure
(jeżeli system odpowiada nam "not found", należy napisać ./configure, jawnie określając, że program jest w katalogu bieżącym). Program configure dokona sprawdzenia naszego systemu i dostosuje różne elementy instalowanego programu do używanej przez nas odmiany Unixa. Po zakończeniu tego procesu, gdy ponownie pojawi się zgłoszenie systemu, wpisujemy:

     make
Polecenie to uruchomi dość długo trwający proces kompilacji programu z postaci źródłowej w języku C, w jakiej program jest rozpowszechniany, do gotowego pliku wykonywalnego. Tu może pojawić się kolejna przeszkoda - kompilator języka C może nie być dostępny dla użytkowników. W takim przypadku znów niezbędny będzie kontakt z administratorem...

Kompilacja programu została zakończona. Gdybyśmy mieli uprawnienia administratora, moglibyśmy teraz wpisać "make install", co zainstalowałoby program w publicznych katalogach na dysku, dostępnych dla wszystkich użytkowników. Jako że takich uprawnień nie mamy, pozostaje nam skopiować utworzony plik wykonywalny w jakieś miejsce, gdzie będziemy go mieć "pod ręką", a resztę plików wyprodukowanych w procesie instalacji usunąć. Interesujący nas plik wykonywalny znajduje się w podkatalogu src; przenieśmy go do swojego katalogu osobistego:

     mv src/wget ~
W podkatalogu doc znajdziemy przykładowy plik konfiguracyjny sample.wgetrc oraz pliki składające się na instrukcję obsługi programu: wget.info, wget.info-1, wget.info-2 i wget.info-3. Zachowajmy je również - mogą się później przydać:

     mv doc/sample.wgetrc ~
     mv doc/wget.info* ~
Teraz możemy powrócić do katalogu macierzystego i usunąć niepotrzebny już podkatalog wget-1.5.3 z całą zawartością:

     cd ~
     rm -r wget-1.5.3
Od tego momentu możemy już używać programu wget. Jak widać, instalacja wcale nie jest taka trudna, choć niewątpliwie wymaga większej orientacji w działaniu systemu niż instalacja programów w MS-Windows. Program do działania nie wymaga żadnych dodatkowych plików, choć możemy zmodyfikować jego domyślny sposób działania (np. zmienić domyślną głębokość ściągania witryny, liczbę powtórzeń w przypadku przerwania transmisji, czy też nakazać programowi niesprawdzanie adresów IP - odpowiednik parametru -nh) za pomocą pliku konfiguracyjnego. Plik taki, o nazwie .wgetrc (kropka na początku nazwy!), powinien się znajdować w macierzystym katalogu użytkownika. Może też istnieć systemowy plik konfiguracyjny, w którym administrator serwera ustawia parametry domyślne dla wszystkich użytkowników - najczęściej jest to /usr/local/etc/wgetrc. O tym jednak najlepiej już dokładnie poczytać w instrukcji do programu...

Program wget został również przeniesiony do środowiska Windows 95/NT - wersję tę znaleźć można pod adresem http://www.interlog.com/~tcharron/wgetwin.html. Używanie programu na lokalnym PC w mojej opinii jest jednak mało sensowne - niweluje bowiem jego podstawowy atut, jakim jest możliwość ściągania plików "off-line". Program może być natomiast przydatny administratorom serwerów WWW działających pod Windows NT, którzy za jego pomocą chcieliby np. realizować mirrory witryn WWW.


Jarosław Rafa 1998. Tekst udostępniony na licencji Creative Commons (uznanie autorstwa - użycie niekomercyjne - bez utworów zależnych). Kliknij tutaj, aby dowiedzieć się, co to oznacza i co możesz z tym tekstem zrobić. W razie jakichkolwiek wątpliwości licencyjnych bądź w celu uzyskania zgody na rozpowszechnianie wykraczające poza warunki licencji proszę o kontakt e-mailem: raj@ap.krakow.pl.

Wersja HTML opracowana 8.02.99.


Powrót do wykazu artykułów o Internecie Statystyka