Selektywne ściąganie stron www 14


Celem niniejszego artykułu jest przedstawienie narzędzi do ściągania z Internetu kompletnych stron WWW, czyli tworzenia ich kopii (mirror) np na dysku twardym naszego komputera. W zamierzeniach początkowych, artykuł miał przedstawić tylko możliwości jednego programu, którym jest wget. W czasie pisania zdałem sobie sprawę że niektórych może przerażać konsola i zapewne woleli by coś graficznego. Pomyślałem sobie: dlaczego nie?:) Przejrzałem dokładnie repozytoria Ubuntu i wybrałem co ciekawsze projekty, czego wynikiem jest ten artykuł.

Na pierwszy ogień przedstawiam wam program wget, o którym można powiedzieć że jest jednym z podstawowych programów dla wielu użytkowników Linuksa.

sudo apt-get install wget

Sama aplikacja poza ściąganiem pojedynczych plików, do których to nadaje się wręcz idealnie, została wyposażona w możliwość ściągania całych witryn internetowych. Zapytacie zapewne po co wam to skoro wszytko można znaleźć w internecie? Wyobraźmy sobie że właśnie zainstalowałeś Ubuntu i nie działa ci internet. Dodatkowo nie posiadasz drukarki bądź szkoda ci drukować takie rzeczy. Strona na której opisany jest sposób składa się z wielu podstron. Oczywiście można na innym komputerze z internetem zapisywać każdą stronę z osobna, ale po co, skoro można wydać jedno proste polecenie by mieć całą stronę lokalnie na komputerze. A co jeśli strona nagle przestanie istnieć? Warto wcześniej zapisać ją sobie na dysku. Najszybszym sposobem potrzebną nam witrynę ściągniemy za pomocą:

wget -r www.strona.do.sciagniecia.pl

Przełącznik -r odgrywa tutaj kluczową rolę. Gdybyśmy napisali polecenie bez tej opcji to program ściągnął by tylko główną stronę którą domyślnie w wielu przypadkach jest index.html. Magiczny przełącznik -r (rekurencja) nakazuje programowi śledzenie linku (adresów), czyli jej ściągnięcie wraz ze wszystkimi stronami powiązanymi z index.html. Tak jak wspomniałem, jest to najprostszy sposób ściągnięcia strony, ale niestety używając takiego polecenia ryzykujemy, że wget ściągnie wiele bezużytecznych plików. Jednym z rozwiązań jest stosowanie tzw. „głębokości” do której to wget może pobierać stronę. Domyślna maksymalna głębokość to 5 poziomów. A więc:

wget -r -l1 -k www.strona.do.sciagniecia.pl

W tym przypadku strona również ściągana jest rekurencyjnie. Dzięki opcji -l ustawiamy poziom głębokości na wartość równą 1. Przydatnym parametrem przy ściąganiu stron jest opcja -k (convert-links) o której wcześniej nie wspomniałem. Pozwolicie że zacytuje instrukcję:

Po zakończeniu pobierania konwertuje ona odnośniki w dokumencie tak, by nadawały się do lokalnego przeglądania. Dotyczy to nie tylko widzialnych odnośników hipertekstowych, ale każdej części dokumentu, która prowadzi do zewnętrznych materiałów, jak osadzone obrazki, odnośniki do arkuszy stylów, odnośniki hipertekstowe do zawartości innej niż HTML, itp. Każdy odnośnik będzie zmieniony na jeden z dwu sposobów:

  • Odnośniki do plików, które zostały ściągnięte przez Wget zostaną zmienione tak, by odwoływały się do pliku, na jaki wskazują, jako odnośniki względne. Przykład: jeśli ściągnięty plik `/foo/doc.html’ jest powiązany z z `/bar/img.gif’, również ściągniętym, to odnośnik w `doc.html’ zostanie zmieniony tak, by wskazywał na `../bar/img.gif’. Ten rodzaj przekształcenia działa bezproblemowo dla dowolnej kombinacji katalogów.
  • Odnośniki do plików, które nie zostały ściągnięte przez Wget zostaną zmienione tak, by zawierały nazwę hosta i ścieżkę bezwzględną miejsca, na które wskazują. Przykład: jeśli ściągnięty plik `/foo/doc.html’ jest powiązany z z `/bar/img.gif’ (lub z `../bar/img.gif’), to odnośnik w `doc.html’ zostanie zmieniony tak, by wskazywał na `http://hostname/bar/img.gif’.

W wielkim skrócie, zastosowanie przełącznika -k powoduje że przeglądanie lokalne działa niezawodnie. Kolejne modyfikacje naszego polecenia mogą doprowadzić do odrzucania niechcianych plików czy też ustawienia maksymalnej ilości danych jakie można ściągnąć z danej strony. Na sam koniec przed zaproszeniem do manuala, chciałbym wspomnieć że jest jeszcze jeden bardzo przydatny przełącznik, mianowicie –-mirror . Dzięki niemu wget włącza opcje odpowiednie do tworzenia kopii lustrzanych stron, czyli: rekurencję, stosowanie znaczników czasu, ustawia nieograniczony poziom rekurencji i zachowuje listingi katalogów FTP. Tak jak wspomniałem wcześniej, zapraszam do skorzystania z polskiego manuala wget, ponieważ możliwości programu są zbyt duże jak na ten skromy artykuł. Sam program doczekał się kilku nakładek graficznych min gwget.

sudo apt-get install gwget

Osobiście nie polecam tego programu ze względu na bardzo okrojone możliwości. Dzięki niemu wykorzystacie może 5-10% potencjału tkwiącego w wget.

Podczas przeglądania repozytoriów natknąłem sie również na program httrack.

sudo apt-get install httrack

Program wprawdzie nie posiada tyle opcji co wspomniany wget, ale również te zaimplementowane potrafią cieszyć. Zarówno jak wcześniej opisywany, httrack działa w konsoli. Można z niego korzystać na 2 sposoby. Podobnie jak to było w wget, możemy wydać odpowiednie polecenie lub przejść w tryb interaktywny. Pisząc interaktywny mam na myśli: uruchamiamy program httrack w konsoli, a on zadaje nam serię pytań. Na samym końcu po ustaleniu wszystkiego z użytkownikiem uruchamia proces ściągania. Ci co nie lubią konsoli mogą skorzystać z nakładki graficznej webhttrack.

sudo apt-get install webhttrack

Po uruchomieniu programu, otwiera nam się przeglądarka internetowa która w adresie ma wpisany adres hostname:8080. Cały interfejs w tym przypadku jak się zapewne domyślacie, jest w postaci stron internetowych. Plusem tej nakładki jest to iż potrafi ona przemówić do nas w ojczystym języku. Kolejne GUI, mianowicie khttrack jest napisany pod środowisko graficzne KDE. Niestety nie ma jej w repozytoriach.

Na zakończenie, mając nadzieję że nie przeraziłem Cię konsolą zapraszam do testowania właśnie tego typu programów. To co że programy nie są graficzne, że nie możemy używać drag & drop. Proszę weź tylko pod uwagę jak bardzo GUI tłumi możliwość np takiego wget. Mam nadzieje że choć w malutkim stopniu przyczynie się do przemyśleń nad tą kwestią. Od siebie mogę tylko dodać że w życiu nie widziałem nakładki graficznej, która by w 100% oddawała możliwości i potencjał danego programu.

SlavNix, dziękuje za znaczącą pomoc w trakcie pisania tego małego artykułu:)
Linki
(1) wget – http://www.gnu.org/software/wget/wget.html
(2) wget manual – http://ptm.linux.pl/man_HTML/info_pl_HTML/wget/wget_toc.html
(3) gwget – http://www.gnome.org/projects/gwget/
(4) httrack – http://www.httrack.com/
(5) webhttrack http://www.httrack.com/page/21/en/index.html
(6) khttrack http://www.nongnu.org/khttrack/index.html


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

14 komentarzy do “Selektywne ściąganie stron www

  • Silmethule

    Żeby pokazać, że by zrobić backupa jakiejś stronki nie trzeba klikać w Firefoksie „Plik => Zapisz stronę jako…”, a można to zrobić wygodnie genialnym wgetem, nie odpalając przeglądarki i nie męcząc procka i ramu ;).

  • Dario

    Po co? Chociażby po to, żeby zgrać serwis na płytkę CD dorzucić CD autorun i mamy wspaniały prezent jeśli chcemy zaprezentować firmę, organizację lub tym podobne.

  • MrRobby Autor wpisu

    [quote comment=”7224″]Ja tam wolę wget -t0 -b -np -m[/quote]
    Możliwości programu są tak duże że w artykule gorąco zachęcałem do manuala 🙂 Wszystkich opcji i przypadków użycia opisać nie sposób 🙂

  • kwalo

    A ja muszę przyznać, że trochę się rozczarowałem po przeczytaniu tego artykułu. Miało być o „selektywnym ściąganiu stron”, więc miałem nadzieję, że uda mi się z danej strony ściągnąć tylko pewne linki, a innych nie. Nie doszukałem się takiej opcji w tym artykule. Dlatego wymyśliłem swój sposób. Chodziło mi o to, żeby ściągnąć dokumentację Gtk dla języka Ruby ze strony: http://ruby-gnome2.sourceforge.jp/hiki.cgi?Ruby/GTK
    Problem w tym, że poza opisem klas na stronie jest sporo linków, które mnie kompletnie nie interesują, np. odnośniki do tłumaczeń w innych językach. Potrzebowałem tylko dokumentacji klas. Z pomocą przyszła mi niedoceniana przez wielu przeglądarka lynx. Po podaniu opcji -dump tworzy ona całkiem zgrabnie poformatowany tekst ze strony, wraz z odnośnikami na dole. Dzięki innym podstawowym narzędziom uniksowym udało mi się spośród nich wybrać te strony, które mnie interesują. Jedno polecenie, które z powyższej strony ściągnie tylko te dokumenty, które ja chcę (w tym przypadku dokumentację klas):
    lynx -dump 'http://ruby-gnome2.sourceforge.jp/hiki.cgi?Ruby/GTK' | grep 'http://' | awk '{print $2}' | grep Gtk | xargs wget -EkOstatnia część potoku – xargs wget -Ek sprawia, że wszysko, co program grep wypisał na standardowe wyjście jest zczytywane przez program xargs i przekazywane wgetowi do ściągnięcia. Opcje -Ek sprawiają, że dokumenty stają się możliwe do przeglądania offline. Linki prowadzą we właściwe miejsce, a rozszerzenia html są dopisywane do dokumentów, które tego rozszerzenia nie mają (czyli w tym wypadku do wszystkich).

  • hosti

    Witam.

    Ja natomiast szukałem takiego programu dla mojego ojca.
    Jako, że przyzwyczajony był do Win$ta to konsola jest mu całkiem obca, tak więc napisałem krótki skrypt w bash-u.

    – Tworzymy na pulpicie plik o nazwie_jakiej_chcecie i katalog sciagniete (do tego kat, będą pobierane strony).
    – Otwieramy nasz pusty plik i w nim wpisujemy:

    #!/bin/bash

    #polecenie clear czyści ekran

    clear

    #wchodzimy do kat

    cd sciagniete
    echo „————————————————————-”
    echo „* Program do sciagania stron – podaj nastepujace wartosci *”
    echo „————————————————————-”

    echo -n „Wpisz ilosc podstron:”

    read podstrona

    echo -n „Wpisz adres strony:”

    read strona
    echo ” ”
    echo ” ”
    echo „————-**************————”
    echo „Podstron do sciagniecia: $podstrona”
    echo „Podales strone: $strona”
    echo „————***************————”

    wget -r -l$podstrona -k $strona

    #——————————————————-

    – Zapisujemy plik i nadajemy mu tylko prawa chmod x nazwapliku.

    Po kliknieciu na nasz plik z pulpitu zostaniemy zapytani co zrobić. Klikamy Uruchom w terminalu, podajemy wartości o jakie prosi skrypt ot i tyle.

    Gdyby ktoś miał problemy lub sugestie co jeszcze można dodać/zmienić -> hostister (at) gmail com

  • Coolm@x

    [quote comment=”7234″]Mógłby mi ktoś pomóc „zmirrorować” poniższą stronę? Bo jakoś metody przytoczone w tym artykule zdają się nie działać (wget nie podąża za linkami).
    http://www.moodle.pg.gda.pl/file.php/32/skrypt/PLforPL/toc.html%5B/quote%5D

    A sprawdzałeś co zawiera plik robots.txt na tym serwerze? Jeżeli dissallow / to wget nie pobierze żadnych innych plików prócz robots.txt i index.* jeśli chcesz, aby wget pomijał ten plik, edytuj wgetrc (w przypdaku slackware jest on w /etc/) i dodaj/zmień opcję robots = on na off