Program wget, o którym traktuje niniejszy tekst, różnią jednak od

Transkrypt

Program wget, o którym traktuje niniejszy tekst, różnią jednak od
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 -Rmoż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.cyfkr.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.cyfkr.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
dohttp://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 wget1.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...