martes, 1 de julio de 2008

¿Alguna vez viste a un bot?

Un bot es algo bastante menos interesante que la imagen de la izquierda. Como ya dijimos en el post anterior, se trata "de un simple programita que visita páginas de internet de manera automática, las copia, las manda al “Page Depository”, luego visita cada uno de los links que tenía esa página y así sucesivamente."

Yo nunca había visto un bot, hasta que me crucé con uno en el libro "Google PageRank and Beyond". Me pareció muy simpático así que decidí ponerlo en un post.

Está escrito en lenguaje "Matlab", y la intención no es entrar en el detalle de cada línea de código (lo que está muchísimo más allá de mis posibilidades), sino sólo saber de que se trata. Matlab tiene dos comandos interesantes para la creación de bots: uno que se llama "urlread" que permite leer la página, y otro llamado "urlwrite" que permite copiarla para pasarla al "Page repository".

Ahí va, a no desmayarse:

function [U,L] = surfer(root,n)
% SURFER Create the adjacency matrix of a portion of the Web.
% [U,L] = surfer(root,n) starts at the URL root and follows
% Web links until it forms an n-by-n adjacency matrix of links.
% U = a cell array of the URLs visited.
% L = sparse matrix with L(i,j)=1 if url {i} is linked to url {j}.
%
% Example: [U,L] = surfer('http://www.harvard.edu',500);
%
% This function currently has two defects. (1) The algorithm for
% finding links is naive. We just look for the string 'http:'.
% (2) An attempt to read from a URL that is accessible, but very slow,
% might take an unacceptably long time to complete. In some cases,
% it may be necessary to have the operating system terminate MATLAB.
% Key words from such URLs can be added to the skip list in surfer.m.


% Initialize
U = cell(n,1);
hash = zeros(n,1);
L = logical(sparse(n,n));
m = 1;
U{m} = root;
hash(m) = hashfun(root);


j = 1;
while j <>
% Try to open a page.
try set(t1,'string',sprintf('%5d %s',j,U{j})) set(t2,'string','');
drawnow page = urlread(U{j});
catch set(t1,'string',sprintf('fail: %5d %s',j,U{j})) drawnow j = j+1;
continue end if get(slow,'value') pause(.25) end
% Follow the links from the open page.
for f = findstr('http:',page);
% A link starts with 'http:' and ends with the next quote.
e = min([findstr('"',page(f:end)) findstr('''',page(f:end))]);
if isempty(e), continue, end url = deblank(page(f:f+e-2)); url(url<' ') = '!';
% Nonprintable characters if url(end) == '/', url(end) = [];
end
% Look for links that should be skipped.
skips = {'.gif','.jpg','.jpeg','.pdf','.css','.asp','.mwc','.ram', ... '.cgi','lmscadsi','cybernet','w3.org','google','yahoo', ... 'scripts','netscape','shockwave','webex','fansonly'};
skip = any(url=='!') any(url=='?');
k = 0;
while ~skip & (k < k =" k+1;">
skip = ~isempty(findstr(url,skips{k}));
end if skip if isempty(findstr(url,'.gif')) & isempty(findstr(url,'.jpg'))
set(t2,'string',sprintf('skip: %s',url)) drawnow if get(slow,'value') pause(.25)
end
end continue end
% Check if page is already in url list.
i = 0; for k = find(hash(1:m) == hashfun(url))';
if isequal(U{k},url) i = k; break
end
end
% Add a new url to the graph there if are fewer than n.
if (i == 0) & (m < m =" m+1;">
hash(m) = hashfun(url); i = m;
end %
Add a new link. if i > 0
L(i,j) = 1;
set(t2,'string',sprintf('%5d %s',i,url))
line(j,i,'marker','.','markersize',6)
drawnow
if get(slow,'value')
pause(.25)
end
end
end
j = j+1;
end
delete(t1)
delete(t2)
delete(slow)
set(quit,'string','close','callback','close(gcf)','value',0)
%------------------------
function h = hashfun(url)
% Almost unique numeric hash code for pages already visited.
h = length(url) + 1024*sum(url);


Como al bot también le dicen "spider", acá te pongo una araña para que persiga a tu mouse :)