Zadanie #5 - crawler http

Celem zadania jest wykonanie programu, który będzie wykonywał uproszczone "crawlowanie" serwisu WWW wskazanego w parametrze. Program powinien przyjmować jeden parametr, który reprezentuje adres pewnego serwisu www.

Program  powinien wykonać następujące czynności:
  1. połączyć się ze wskazanym serwerem (zapytanie http powinno zawierać paramestr Host)
  2. ściągnąć dokument główny tego serwisu
  3. przeanalizować treść dokumentu i wyszukać w nim:
  1. odnośniki do innych dokumentów w tym samym serwisie (znaczniki <a>)
  2. odnośniki do plików graficznych (znaczniki <img>)
  3. adresy email (wszystkie - i te umieszczone w znacznikach <a>, i te umieszczone tylko w treści
  1. zapisać pozyskane informacje w pliku w postaci opisanej w dalszej części zadania
  2. dla każdego dokumentu z tego samego serwisu, do którego prowadzi odnośnik przeprowadzić czynności opisane w punkcie 3 (operację tę należy przeprowadzać rekurencyjnie aż do zebrania informacji o wszystkich dokumentach serwisu).
Informacje należy zapisać w pliku <adres_serwisu_www>.xml o strukturze zdefiniowanej poniższym uproszczonym DTD:

<!ELEMENT site - - (document+ & image+ & email+)>
<!ELEMENT document - - (#PCDATA)>   <!-- URI dokumentu -->
<!ELEMENT image - - (#PCDATA)> <!-- URI obrazka -->
<!ELEMENT email - - (#PCDATA)> <!-- URI obrazka -->

Dla przykładu: jeśli serwis o adresie http://www.service.com składa się z dwóch dokumentów html o nazwach index.html i index2.html, a w dokumentach wykorzystuje się dwa obrazki o nazwach img1.png i img2.jpg, a w jednym z dokumentów umieszczono adres e-mail postać webmaster@service.com, to plik taki powinien zawierać:

<site>
<document>
    http://www.service.com/index.html
</document>
<document>
    http://www.service.com/index2.html
</document>
<image>
    http://www.service.com/img1.png
</image>
<image>
    http://www.service.com/img2.jpg
</image>
<email>
    webmaster@service.com
</email>
</site>

Uwaga: przed wykonaniem zadania wskazane jest zapoznanie się z RFC 2616, jednak stanowczo odradzam czytanie tego dokumentu w całości od deski do deski. Konieczne jest z pewnością zapoznanie się ze składnią polecenia GET oraz sposobem sygnalizowania błędow przez serwer http.

Linki testowe:

Ustalenia dodatkowe: Ocenianie: