<h3>Roboty internetowe</h3>

<p>
<strong>Roboty internetowe</strong>,
nazywane 
w anglojęzycznej literaturze
<em>web crawler</em>,
<em>web spider</em>
czy <em>web robot</em>
to programy komputerowe 
automatycznie przeszukujące
zasoby sieci WWW.
Wędrują one po sieci WWW,
pobierając adresy kolejnych stron do odwiedzenia
z hiperłączy znalezionych w dokumentach.
Robot, który trafi na stronę główną witryny
zawierającej kod:
</p>


<pre>
&lt;body&gt;
  ...
  &lt;ul id="menu"&gt;
    &lt;li&gt;&lt;a href="lorem.html"&gt;lorem&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="ipsum.html"&gt;ipsum&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="dolor.html"&gt;dolor&lt;/a&gt;&lt;/li&gt;	        
    ...
  &lt;/ul&gt;
  ...
&lt;/body&gt;
</pre>

<p>
pozna adresy podstron:
<span class="filename">lorem.html</span>,
<span class="filename">ipsum.html</span> i
<span class="filename">dolor.html</span>.
W następnym etapie pobierze wymienione trzy 
dokumenty i przeanalizuje je.
Wyszuka wszystkie występujące w nich hiperłącza,
a znalezione adresy 
doda do listy stron, które zostaną przeszukane 
w następnym etapie.
W ten sposób robot internetowy,
rozpoczynając wędrówkę od strony głównej,
może wędrować po wszystkich podstronach serwisu,
a także &mdash; w przypadku hiperłączy prowadzących do 
innych witryn &mdash; przemieszczać się 
pomiędzy różnymi domenami.
</p>

<p>
Każdy robot jest identyfikowany 
poprzez nazwę przekazywaną w 
parametrze <span class="variable">User-Agent</span> protokołu HTTP:
</p>

<pre>
User-Agent: CERN-LineMode/2.15 libwww/2.17b3
</pre>

<p>
Zatem dostęp do stron serwisu możemy 
blokować wybranym robotom na podstawie ich nazwy.
(Obszerna baza danych 
z nazwami robotów jest dostępna pod adresem 
<a href="http://www.user-agents.org">http://www.user-agents.org</a>.
Nazwy robotów Google są zawarte w ramce.)
</p>

#####{$frames[1]}#####

<p>
Zadania realizowane przez robota mogą być różne: 
od utworzenia kopii serwisu,
przez audyt i walidację aż po utworzenie indeksu 
podstron na potrzeby wyszukiwarki.
Bez wątpienia najważniejszą grupą
są <strong>roboty wyszukiwarek internetowych</strong>,
odpowiedzialne za indeksację witryny.
Google, Onet, Yahoo, WP &mdash; wszystkie 
wyszukiwarki dysponują własnymi robotami,
które bezustannie przeszukują internet
i uaktualniają bazę danych wyszukiwarki.
To, na ile witryna jest przyjazna robotom wyszukiwarek,
może mieć wpływ na pozycjonowanie.
</p>

<p>
Dwie podstawowe techniki ułatwiania dostępu do podstron witryny robotom
wyszukiwarek to czytelne hiperłącza i strona z mapą witryny.
Metody te warto wzbogacić o 
pliki <span class="filename">robots.txt</span> oraz 
<span class="filename">sitemap.xml</span>.
W ten sposób zyskamy dodatkowe możliwości poinformowania robotów 
o pełnej zawartości serwisu.
Ułatwi to indeksację nowych podstron oraz aktualizację danych 
stron już zaindeksowanych.
</p>

<h3>Plik <span class="filename">robots.txt</span></h3>

<p>
Plik <span class="filename">robots.txt</span> pozwala na zablokowanie 
dostępu do stron WWW robotom internetowym.
Należy go umieścić w folderze głównym serwisu WWW.
Na przykład dla witryny <span class="variable">http://www.example.net</span>
plik <span class="filename">robots.txt</span> powinien być dostępny pod adresem
<span class="variable">http://www.example.net/robots.txt</span>.
</p>

<p>
Brak pliku <span class="filename">robots.txt</span> lub plik 
<span class="filename">robots.txt</span> o pustej zawartości
pozwalają wszystkim robotom
na pełny dostęp do wszystkich dokumentów na serwerze.
</p>

<p>
W zależności od robota, plik <span class="variable">robots.txt</span> 
może być pobierany 
w różnych odstępach czasu.
Na przykład roboty Google 
pobierają plik <span class="filename">robots.txt</span> raz na dobę.
(Datę i godzinę ostatniego pobrania pliku <span class="filename">robots.txt</span>
przez robota Google możemy 
sprawdzić w <span class="option">Narzędziach Webmastera</span> dostarczanych
przez Google
<a href="http://www.google.com/webmasters/">http://www.google.com/webmasters/</a>.)
Ilustruje to rysunek 1.
</p>

#####{$figures[1]}#####

<p>
Każda domena ma oddzielny plik <span class="filename">robots.txt</span>.
Dla domen:
</p>

<pre>
example.net
a.example.net
b.example.net
</pre>

<p>
roboty będą szukały plików:
</p>

<pre>
http://example.net/robots.txt
http://a.example.net/robots.txt
http://b.example.net/robots.txt
</pre>

<p>
Należy pamiętać, że robot może nie stosować się do zaleceń
zawartych w pliku <span class="filename">robots.txt</span>.
Plik ten <strong>nie może być traktowany</strong> jako mechanizm zabezpieczania 
dostępu do tajnych danych.
</p>

#####{$frames[2]}#####

<h3>Składnia pliku <span class="filename">robots.txt</span></h3>

<p>
Pierwotnie, pliki <span class="filename">robots.txt</span> 
mogły zawierać wyłącznie dwa rodzaje wpisów:
</p>

<pre>
User-agent
Disallow
</pre>

<p>
Błędem jest na przykład użycie 
<span class="variable">Allow</span>:
</p>

<pre>
<strong>PRZYKŁAD BŁĘDNY</strong>
Allow
</pre>

<p>
Co ciekawe, wpisy <span class="variable">Allow</span> występują w 
pliku <a href="http://www.google.com/robots.txt">http://www.google.com/robots.txt</a>.
</p>

<p>
Pierwszy z wpisów, <span class="variable">User-agent</span>, 
ustala nazwę robota, np.:
</p>

<pre>
User-agent: *
User-agent: Slurp
User-agent: Googlebot
</pre>

<p>
Drugi wpis, <span class="variable">Disallow</span>, 
podaje nazwę pliku lub folderu,
do którego dostęp ma być zablokowany, np.:
</p>

<pre>
Disallow: /
Disallow: /tmp/
Disallow: /info.html
Disallow: /me.jpg
</pre>

<p>
Wpis <span class="variable">User-agent</span> występuje jako pierwszy,
a po nim następuje jeden lub kilka wpisów <span class="variable">Disallow</span>, np.:
</p>

<pre>
User-agent: Googlebot
Disallow: /cgi/
Disallow: /tmp/
Disallow: /data/photos/
Disallow: /data/texts/
</pre>

<p>
W pliku <span class="filename">robots.txt</span> 
mogą występować jednolinijkowe komentarze rozpoczynające się
znakiem <span class="variable">#</span> (haszmark):
</p>

<pre>
# Ogolne
User-agent: *
Disallow: /
</pre>

<p>
Uwaga: znak <span class="variable">*</span> nie jest dozwolony w ścieżkach. 
Część robotów może go nie interpretować, przez co uzyskają dostęp do 
zasobów, które miały być zablokowane.
Zamiast:
</p>

<pre>
<strong>PRZYKŁAD BŁĘDNY</strong>
Disallow: /tmp/*
</pre>

<p>
należy pisać:
</p>

<pre>
Disallow: /tmp/
</pre>

<h3>Przykładowe pliki <span class="filename">robots.txt</span></h3>

<h4>Przykład 1</h4>

<p>
Wszystkie roboty mogą odwiedzać wszystkie pliki:
</p>

<pre>
User-agent: *
Disallow:
</pre>

<p>
Ten sam efekt da pusty plik <span class="filename">robots.txt</span> 
lub brak pliku <span class="filename">robots.txt</span>.
</p>

<h4>Przykład 2</h4>

<p>
Zakaz pobierania czegokolwiek przez kogokolwiek:
</p>

<pre>
User-agent: *
Disallow: /
</pre>

<h4>Przykład 3</h4>

<p>
Żaden robot nie może zaglądać do żadnego z trzech folderów:
</p>

<pre>
User-agent: *
Disallow: /cgi/
Disallow: /private/
Disallow: /tmp/
</pre>

<h4>Przykład 4</h4>

<p>
Konkretny robot ma zakazany wstępu do konkretnego folderu:
</p>

<pre>
User-agent: Googlebot-Image
Disallow: /photos/
</pre>

<h4>Przykład 5</h4>

<p>
Żaden robot nie powinien pobierać pliku
<span class="filename">file.html</span>:
</p>

<pre>
User-agent: *
Disallow: /directory/file.html
</pre>

<h4>Przykład 6</h4>

<p>
Zakaz dostępu do serwisu
dla pięciu wybranych programów kopiujących 
całe witryny WWW:
</p>

<pre>
User-agent: WebStripper
Disallow: /

User-agent: WebCopier
Disallow: /

User-agent: TeleportPro
Disallow: /

User-agent: HTTrack
Disallow: /

User-agent: wget
Disallow: /
</pre>

<h3>Rozszerzenia oryginalnej składni <span class="filename">robots.txt</span></h3>

<p>
Najważniejszym rozszerzeniem składni 
pliku <span class="filename">robots.txt</span> 
jest dyrektywa <span class="variable">Sitemap</span>.
Służy ona do wskazania pliku zawierającego mapę witryny.
Parametrem dyrektywy jest adres URL mapy:
</p>

<pre>
Sitemap: http://www.example.com/sitemap.xml
</pre>

<p>
Dyrektywa <span class="variable">Sitemap</span>
jest niezależna od dyrektywy <span class="variable">User-agent</span> i 
może być obecna w dowolnym miejscu pliku <span class="filename">robots.txt</span>.
Na stronach wyszukiwarki Google znajdują się informacje 
mówiące o tym, że roboty Google 
respektują dyrektywę <span class="variable">Sitemap</span>.
</p>

<p>
Kolejnymi rozszerzeniami są
dyrektywy <span class="variable">Request-rate</span> oraz 
<span class="variable">Visit-time</span>.
Pierwsza z nich ustala maksymalne tempo, w jakim
robot może przeszukiwać cały serwis,
a drugi wskazuje godziny, w których robot może 
wędrować po serwisie.
Na przykład wpis:
</p>

<pre>
User-agent: *
Request-rate: 1/5       
Visit-time: 0600-0845
</pre>

<p>
ogranicza tempo pobierania do jednej strony na pięć sekund
w godzinach pomiędzy 6:00 a 8:45.
Powyższe informacje pochodzą z Wikipedii.
Na stronach wyszukiwarki Google nie znalazłem potwierdzenia, 
że powyższe dyrektywy są respektowane.
</p>

<p>
Ponadto niektóre roboty, na przykład Googlebot,
wprowadziły interpretację znaków <span class="variable">*</span> oraz 
<span class="variable">?</span> w nazwach plików i folderów.
</p>

#####{$tables[1]}#####

<h3>Plik <span class="filename">sitemap.xml</span></h3>

<p>
Plik <span class="filename">sitemap.xml</span> 
ułatwia indeksację witryny WWW.
Zawiera on adresy URL podstron serwisu wraz z informacjami
o dacie ostatniej modyfikacji.
Dzięki temu roboty szybciej odnajdą i zaindeksują 
nowe podstrony, jakie pojawiły się w serwisie.
</p>

<p>
Plik <span class="filename">sitemap.xml</span> wykorzystuje format XML.
Należy stosować kodowanie utf-8, zaś wszystkie 
wystąpienia znaków
<span class="variable">&lt;&gt;&amp;'"</span>
należy zastąpić encjami:
</p>

<pre>
&lt;  -  &amp;lt;
&gt;  -  &amp;gt;
&amp;  -  &amp;amp;
'  -  &amp;apos;
"  -  &amp;quot;
</pre>

<p>
Pojedynczy plik
<span class="filename">sitemap.xml</span> 
musi być mniejszy niż 10 MB
i może zawierać co najwyżej 10 000 adresów URL.
</p>

<p>
Plik z mapą witryny 
nie może być umieszczony na innym serwerze
ani wewnątrz drzewa katalogów.
Plik:
</p>

<pre>
http://www.example.net/art/new/sitemap.xml
</pre>

<p>
może wyłącznie dotyczyć adresów URL zawartych wewnątrz:
</p>

<pre>
http://www.example.net/art/new/
</pre>

<p>
Nie może dotyczyć adresów z wyższego folderu, np.:
</p>

<pre>
http://www.example.net/other/
</pre>

<p>
ani tym bardziej z innej domeny.
</p>

<h3>Format pliku <span class="filename">sitemap.xml</span></h3>

<p>
Plik <span class="filename">sitemap.xml</span> zawiera następujące elementy XML:
<span class="variable">urlset</span>,
<span class="variable">url</span>,
<span class="variable">loc</span>,
<span class="variable">lastmod</span>,
<span class="variable">changefreq</span> i
<span class="variable">priority</span>.
</p>

<h4>Element <span class="variable">urlset</span></h4>

<p>
Element <span class="variable">urlset</span> jest wymagany.
Zawiera on wewnątrz wszystkie adresy URL,
jakie są zawarte w mapie witryny. Atrybut <span class="variable">xmlns</span> 
ustala wersję protokołu sitemap:
</p>

<pre>
&lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&gt;
  &lt;url&gt;...&lt;/url&gt;
  &lt;url&gt;...&lt;/url&gt;
  ...  
&lt;/urlset&gt;
</pre>

<h4>Element <span class="variable">url</span></h4>

<p>
Element <span class="variable">url</span> jest wymagany. 
Występuje wyłącznie wewnątrz <span class="variable">urlset</span>.
Opisuje on pojedynczy adres URL.
Zawiera elementy: <span class="variable">loc</span>, 
<span class="variable">lastmod</span>, 
<span class="variable">changefreq</span> oraz 
<span class="variable">priority</span>.
</p>

<pre>
&lt;url&gt;
  &lt;loc&gt;...&lt;/loc&gt;
  &lt;lastmod&gt;...&lt;/lastmod&gt;  
  &lt;changefreq&gt;...&lt;/changefreq&gt;    
  &lt;priority&gt;...&lt;/priority&gt;    
&lt;/url&gt;
</pre>

<h4>Element <span class="variable">loc</span></h4>

<p>
Element wymagany. 
Występuje wyłącznie wewnątrz <span class="variable">url</span>.
Ustala adres URL pojedynczego wpisu mapy.
Podany adres musi rozpoczynać się od przedrostka 
(np. <span class="variable">http://</span>), np.:
</p>

<pre>
&lt;loc&gt;http://www.gajdaw.pl/nowosci.html&lt;/loc&gt;
</pre>

<p>
W adresie należy stosować encje oraz kodowanie URL.
Na przykład adres:
</p>

<pre>
http://www.example.com/ümlat.php&q=name
</pre>

<p>
należy zakodować jako:
</p>

<pre>
http://www.example.com/%C3%BCmlat.php&amp;q=name
</pre>

<p>
Znak <span class="variable">&amp;</span> 
zapisano w postaci encji <span class="variable">&amp;amp;</span>,
zaś literę <span class="variable">ü</span>
zakodowano w utf-8 i przedstawiono w postaci
<span class="variable">%C3%BC</span>.
</p>

<p>
Pojedynczy adres URL być krótszy niż 2048 znaków.
</p>

<h4>Element <span class="variable">lastmod</span></h4>

<p>
Element opcjonalny. 
Występuje wyłącznie wewnątrz <span class="variable">url</span>.
Ustala datę ostatniej modyfikacji 
dokumentu, którego adres URL jest podany w elemencie <span class="variable">url</span>.
Data powinna być w formacie 
W3C opisanym w dokumencie <a href="http://www.w3.org/TR/NOTE-datetime">http://www.w3.org/TR/NOTE-datetime</a>.
W skróconej postaci (tj. bez godziny) data 
jest zapisywana jako 
<span class="variable">YYYY-MM-DD</span>, np. 2007-11-02:
</p>

<pre>
&lt;lastmod&gt;2007-11-02&lt;/lastmod&gt;
</pre>

<p>
Formatem pełnym daty 
jest <span class="variable">YYYY-MM-DDTgg:mm:ss</span>,
np. 2007-11-02T18:50:24:
</p>

<pre>
&lt;lastmod&gt;2007-11-02T18:50:24&lt;/lastmod&gt;
</pre>

<h4>Element <span class="variable">changefreq</span></h4>

<p>
Element opcjonalny. 
Występuje wyłącznie wewnątrz <span class="variable">url</span>.
Ustala częstotliwość zmian dokumentu.
Poprawnymi wartościami są:
</p>

<pre>
always
hourly
daily
weekly
monthly
yearly
never
</pre>

<p>
Wartość <span class="variable">always</span> oznacza, że dokument podlega zmianom 
przy każdej próbie dostępu.
</p>

<p>
Przykładowy wpis:
</p>

<pre>
&lt;changefreq&gt;daily&lt;changefreq&gt;
</pre>

<h4>Element <span class="variable">priority</span></h4>

<p>
Element opcjonalny. 
Występuje wyłącznie wewnątrz <span class="variable">url</span>.
Ustala umowną ważność strony
względem innych podstron serwisu.
Wartość powinna być z zakresu od 0 do 1.
Wartością domyślną jest 0.5.
</p>

<pre>
&lt;priority&gt;0.8&lt;/priority&gt;
</pre>

<h4>Przykład pojedynczego pliku z mapą witryny</h4>

<p>
Przykładowy pojedynczy plik 
z mapą witryny 
jest przedstawiony na listingu 1,
zaś tabela 2 zawiera pełne zestawienie elementów
XML, które mogą wystąpić w pliku z mapą witryny.
</p>

#####{$listings[1]}#####

#####{$tables[2]}#####

<h3>Lista map</h3>

<p>
Mapa witryny może być zapisana w jednym pliku
lub może być podzielona na wiele plików.
W przypadku podzielenia mapy witryny
na wiele plików należy także przygotować <strong>indeks map witryny</strong>.
Indeks 
map jest plikiem XML, w którym występują elementy:
<span class="variable">sitemapindex</span>,
<span class="variable">sitemap</span>,
<span class="variable">loc</span>
oraz
<span class="variable">lastmod</span>.
</p>

<p>
Pojedynczy plik z indeksem może zawierać informacje o 1000 map.
</p>

<p>
Zatem wielkość mapy podzielonej na wiele plików jest ograniczona do:
</p>

<pre>
1 000 * 50 000 = 50 000 000
</pre>

<p>
adresów URL.
</p>

<h4>Element <span class="variable">sitemapindex</span></h4>

<p>
Element <span class="variable">sitemapindex</span> jest wymagany.
Zawiera on adresy map witryny. 
Atrybut <span class="variable">xmlns</span> 
ustala wersję protokołu sitemap:
</p>

<pre>
&lt;sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&gt;
  &lt;sitemap&gt;...&lt;/sitemap&gt;
  &lt;sitemap&gt;...&lt;/sitemap&gt;
  ...  
&lt;/sitemapindex&gt;
</pre>

<h4>Element <span class="variable">sitemap</span></h4>

<p>
Element <span class="variable">sitemap</span> jest wymagany. 
Występuje wyłącznie wewnątrz <span class="variable">sitemapindex</span>.
Opisuje on pojedynczy plik z mapą witryny.
Zawiera elementy: <span class="variable">loc</span> oraz
<span class="variable">lastmod</span>.
</p>

<p>
Element <span class="variable">loc</span> jest wymagany. 
Występuje wyłącznie wewnątrz <span class="variable">sitemap</span>
i ustala adres URL pojedynczego pliku z mapą witryny.
</p>

<p>
Element <span class="variable">lastmod</span> jest opcjonalny.
Ustala on datę ostatniej modyfikacji 
podanego pliku z mapą witryny:
</p>

<pre>
&lt;sitemap&gt;
  &lt;loc&gt;http://www.example.pl/artykuly.xml&lt;/loc&gt;
  &lt;lastmod&gt;2007-10-20&lt;/lastmod&gt;
&lt;/sitemap&gt;  
</pre>

#####{$tables[3]}#####

<h4>Przykład mapy z indeksem</h4>

<p>
Mapa stosująca indeks składa się z wielu plików XML.
W przykładzie plikami tymi są:
<span class="filename">sitemapindex.xml</span>, 
<span class="filename">artykuly.xml</span> oraz 
<span class="filename">przyklady.xml</span>.
W pliku <span class="filename">sitemapindex.xml</span>
wymieniamy wszystkie mapy,
zaś w plikach 
<span class="filename">artykuly.xml</span>
oraz <span class="filename">przyklady.xml</span>
wymieniamy poszczególne podstrony.
Przykładowa mapa witryny podzielona na dwa pliki
jest przedstawiona na listingu 2.
</p>

#####{$listings[2]}#####

<h3><span class="filename">robots.txt</span> + <span class="filename">sitemap.xml</span> = ułatwienie indeksacji witryny</h3>

<p>
Wykorzystując pliki <span class="filename">robots.txt</span> oraz 
<span class="filename">sitemap.xml</span> ułatwiamy indeksację 
zawartości serwisu robotom internetowym.
W pliku <span class="filename">robots.txt</span> należy umieścić 
dyrektywę <span class="variable">Sitemap</span> wskazującą plik
z mapą witryny (lub z indeksem map):
</p>

<pre>
<strong>robots.txt</strong>
<strong>----------</strong>
Sitemap: http://www.example.net/sitemap.xml
</pre>

<p>
Natomiast w pliku <span class="filename">sitemap.xml</span>
umieszczamy mapę witryny:
</p>

<pre>
<strong>sitemap.xml</strong>
<strong>----------</strong>
&lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&gt;
  ...
&lt;/urlset&gt;
</pre>

<p>
Robot odwiedzający witrynę 
pobierze plik <span class="filename">robots.txt</span>.
Na jego podstawie pozna adres 
pliku z mapą witryny.
Po pobraniu mapy <span class="filename">sitemap.xml</span>,
robot uzyska pełne informacje 
o podstronach witryny.
</p>

<p>
Najważniejszy z robotów,
Googlebot,
pobiera plik <span class="filename">robots.txt</span> raz na dobę.
</p>