{"id":4998,"date":"2013-06-14T00:28:45","date_gmt":"2013-06-13T22:28:45","guid":{"rendered":"http:\/\/www.palentino.es\/blog\/?p=4998"},"modified":"2013-06-14T10:01:31","modified_gmt":"2013-06-14T08:01:31","slug":"el-algoritmo-de-pagerank-al-detalle","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/el-algoritmo-de-pagerank-al-detalle\/","title":{"rendered":"El algoritmo de PageRank  de google al detalle."},"content":{"rendered":"<p>Os dejo el c\u00f3digo fuente realizado en C# del algoritmo de c\u00e1lculo de Pagerank de un sitio de google.<\/p>\n<p>Pod\u00e9is compilarlo, generar una DLL y usarlo en cualquier proyecto . NET que necesit\u00e9is independientemente del lenguaje usado.<\/p>\n<p>Este es el c\u00f3digo al detalle.<\/p>\n<p><!--more--><\/p>\n<p>El programa ejecutable, lo pod\u00e9is descargar desde aqu\u00ed.\u00a0<strong><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2013\/06\/PageRank.exe\">PageRank<\/a>\u00a0<\/strong>by Palentino.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<pre><span style=\"color: #333399;\">using System;<\/span><\/pre>\n<pre><span style=\"color: #333399;\"> using System.IO;<\/span><\/pre>\n<pre><span style=\"color: #333399;\">using System.Net;<\/span><\/pre>\n<pre><span style=\"color: #333399;\">using System.Text;<\/span><\/pre>\n<pre><span style=\"color: #333399;\">public class GooglePageRank<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/ Devuelve el PageRank una URL suministrada. 0 a 10 \u00f3<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/ -1 (N\/A), que indica que ha existido un error<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/ o la URL no esta indexada.<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/URL a testear<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> public static int GetPageRank(string url)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> int rank = -1;<\/span><\/pre>\n<pre><span style=\"color: #333399;\">try<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> \/\/ URL a completar<\/span>\r\n<span style=\"color: #333399;\"> url = String.Format(\"http:\/\/toolbarqueries.google.com\/tbr\" +<\/span>\r\n<span style=\"color: #333399;\"> \"?client=navclient-auto&amp;features=Rank&amp;ch={0}&amp;q=info:{1}\",<\/span>\r\n<span style=\"color: #333399;\"> ComputeHash(url), UrlEncode(url));<\/span><\/pre>\n<pre><span style=\"color: #333399;\">\/\/ P\u00e1gina de descarga<\/span>\r\n<span style=\"color: #333399;\"> HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);<\/span>\r\n<span style=\"color: #333399;\"> StreamReader stream = new StreamReader(request.GetResponse().GetResponseStream());<\/span>\r\n<span style=\"color: #333399;\"> string response = stream.ReadToEnd();<\/span><\/pre>\n<pre><span style=\"color: #333399;\">\/\/ P\u00e1gina de page rank a parsear<\/span>\r\n<span style=\"color: #333399;\"> string[] arr = response.Split(':');<\/span>\r\n<span style=\"color: #333399;\"> if (arr.Length == 3)<\/span>\r\n<span style=\"color: #333399;\"> rank = int.Parse(arr[2]);<\/span>\r\n<span style=\"color: #333399;\"> }<\/span>\r\n<span style=\"color: #333399;\"> catch (Exception)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> \/\/ No hace nada, pero retorna un -1;<\/span>\r\n<span style=\"color: #333399;\"> }<\/span>\r\n<span style=\"color: #333399;\"> return rank;<\/span>\r\n<span style=\"color: #333399;\"> }<\/span><\/pre>\n<pre><span style=\"color: #333399;\">\/\/\/<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/ URL-encodea la URL dada. \u00datil cuando HttpUtility no est\u00e1 disponible<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/URL a encodear<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> private static string UrlEncode(string url)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> StringBuilder builder = new StringBuilder();<\/span><\/pre>\n<pre><span style=\"color: #333399;\">foreach (char c in url)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> if ((c &gt;= 'a' &amp;&amp; c &lt;= 'z') || (c &gt;= 'A' &amp;&amp; c &lt;= 'Z') || (c &gt;= '0' &amp;&amp; c &lt;= '9'))<\/span>\r\n<span style=\"color: #333399;\"> builder.Append(c);<\/span>\r\n<span style=\"color: #333399;\"> else if (c == ' ')<\/span>\r\n<span style=\"color: #333399;\"> builder.Append('+');<\/span>\r\n<span style=\"color: #333399;\"> else if (\"()*-_.!\".IndexOf(c) &gt;= 0)<\/span>\r\n<span style=\"color: #333399;\"> builder.Append(c);<\/span>\r\n<span style=\"color: #333399;\"> else<\/span>\r\n<span style=\"color: #333399;\"> builder.AppendFormat(\"%{0:X2}\", (byte)c);<\/span>\r\n<span style=\"color: #333399;\"> }<\/span>\r\n<span style=\"color: #333399;\"> return builder.ToString();<\/span>\r\n<span style=\"color: #333399;\"> }<\/span><\/pre>\n<pre><span style=\"color: #333399;\">\/\/\/<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/ Calcula un valor hash requerido por Google<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> private static string ComputeHash(string url)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> UInt32 a, b;<\/span>\r\n<span style=\"color: #333399;\"> UInt32 c = 0xE6359A60;<\/span>\r\n<span style=\"color: #333399;\"> int k = 0;<\/span>\r\n<span style=\"color: #333399;\"> int len;<\/span><\/pre>\n<pre><span style=\"color: #333399;\">\/\/ Modifica la URL<\/span>\r\n<span style=\"color: #333399;\"> url = string.Format(\"info:{0}\", url);<\/span><\/pre>\n<pre><span style=\"color: #333399;\">a = b = 0x9E3779B9;<\/span>\r\n<span style=\"color: #333399;\"> len = url.Length;<\/span><\/pre>\n<pre><span style=\"color: #333399;\">while (len &gt;= 12)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> a += (UInt32)(url[k + 0] + (url[k + 1] &lt;&lt; 8) + (url[k + 2] &lt;&lt; 16) + (url[k + 3] &lt;&lt; 24));<\/span>\r\n<span style=\"color: #333399;\"> b += (UInt32)(url[k + 4] + (url[k + 5] &lt;&lt; 8) + (url[k + 6] &lt;&lt; 16) + (url[k + 7] &lt;&lt; 24));<\/span>\r\n<span style=\"color: #333399;\"> c += (UInt32)(url[k + 8] + (url[k + 9] &lt;&lt; 8) + (url[k + 10] &lt;&lt; 16) + (url[k + 11] &lt;&lt; 24));<\/span>\r\n<span style=\"color: #333399;\"> Mix(ref a, ref b, ref c);<\/span>\r\n<span style=\"color: #333399;\"> k += 12;<\/span>\r\n<span style=\"color: #333399;\"> len -= 12;<\/span>\r\n<span style=\"color: #333399;\"> }<\/span><\/pre>\n<pre><span style=\"color: #333399;\">c += (UInt32)url.Length;<\/span>\r\n<span style=\"color: #333399;\"> switch (len)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> case 11:<\/span>\r\n<span style=\"color: #333399;\"> c += (UInt32)(url[k + 10] &lt;&lt; 24);<\/span>\r\n<span style=\"color: #333399;\"> goto case 10;<\/span>\r\n<span style=\"color: #333399;\"> case 10:<\/span>\r\n<span style=\"color: #333399;\"> c += (UInt32)(url[k + 9] &lt;&lt; 16);<\/span>\r\n<span style=\"color: #333399;\"> goto case 9;<\/span>\r\n<span style=\"color: #333399;\"> case 9:<\/span>\r\n<span style=\"color: #333399;\"> c += (UInt32)(url[k + 8] &lt;&lt; 8);<\/span>\r\n<span style=\"color: #333399;\"> goto case 8;<\/span>\r\n<span style=\"color: #333399;\"> case 8:<\/span>\r\n<span style=\"color: #333399;\"> b += (UInt32)(url[k + 7] &lt;&lt; 24);<\/span>\r\n<span style=\"color: #333399;\"> goto case 7;<\/span>\r\n<span style=\"color: #333399;\"> case 7:<\/span>\r\n<span style=\"color: #333399;\"> b += (UInt32)(url[k + 6] &lt;&lt; 16);<\/span>\r\n<span style=\"color: #333399;\"> goto case 6;<\/span>\r\n<span style=\"color: #333399;\"> case 6:<\/span>\r\n<span style=\"color: #333399;\"> b += (UInt32)(url[k + 5] &lt;&lt; 8);<\/span>\r\n<span style=\"color: #333399;\"> goto case 5;<\/span>\r\n<span style=\"color: #333399;\"> case 5:<\/span>\r\n<span style=\"color: #333399;\"> b += (UInt32)(url[k + 4]);<\/span>\r\n<span style=\"color: #333399;\"> goto case 4;<\/span>\r\n<span style=\"color: #333399;\"> case 4:<\/span>\r\n<span style=\"color: #333399;\"> a += (UInt32)(url[k + 3] &lt;&lt; 24);<\/span>\r\n<span style=\"color: #333399;\"> goto case 3;<\/span>\r\n<span style=\"color: #333399;\"> case 3:<\/span>\r\n<span style=\"color: #333399;\"> a += (UInt32)(url[k + 2] &lt;&lt; 16);<\/span>\r\n<span style=\"color: #333399;\"> goto case 2;<\/span>\r\n<span style=\"color: #333399;\"> case 2:<\/span>\r\n<span style=\"color: #333399;\"> a += (UInt32)(url[k + 1] &lt;&lt; 8);<\/span>\r\n<span style=\"color: #333399;\"> goto case 1;<\/span>\r\n<span style=\"color: #333399;\"> case 1:<\/span>\r\n<span style=\"color: #333399;\"> a += (UInt32)(url[k + 0]);<\/span>\r\n<span style=\"color: #333399;\"> break;<\/span>\r\n<span style=\"color: #333399;\"> default:<\/span>\r\n<span style=\"color: #333399;\"> break;<\/span>\r\n<span style=\"color: #333399;\"> }<\/span>\r\n<span style=\"color: #333399;\"> Mix(ref a, ref b, ref c);<\/span>\r\n<span style=\"color: #333399;\"> return string.Format(\"6{0}\", c);<\/span>\r\n<span style=\"color: #333399;\"> }<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/ ComputeHash() m\u00e9todo de ayuda<\/span>\r\n<span style=\"color: #333399;\"> \/\/\/<\/span>\r\n<span style=\"color: #333399;\"> private static void Mix(ref UInt32 a, ref UInt32 b, ref UInt32 c)<\/span>\r\n<span style=\"color: #333399;\"> {<\/span>\r\n<span style=\"color: #333399;\"> a -= b; a -= c; a ^= c &gt;&gt; 13;<\/span>\r\n<span style=\"color: #333399;\"> b -= c; b -= a; b ^= a &lt;&lt; 8;<\/span>\r\n<span style=\"color: #333399;\"> c -= a; c -= b; c ^= b &gt;&gt; 13;<\/span>\r\n<span style=\"color: #333399;\"> a -= b; a -= c; a ^= c &gt;&gt; 12;<\/span>\r\n<span style=\"color: #333399;\"> b -= c; b -= a; b ^= a &lt;&lt; 16;<\/span>\r\n<span style=\"color: #333399;\"> c -= a; c -= b; c ^= b &gt;&gt; 5;<\/span>\r\n<span style=\"color: #333399;\"> a -= b; a -= c; a ^= c &gt;&gt; 3;<\/span>\r\n<span style=\"color: #333399;\"> b -= c; b -= a; b ^= a &lt;&lt; 10;<\/span>\r\n<span style=\"color: #333399;\"> c -= a; c -= b; c ^= b &gt;&gt; 15;<\/span>\r\n<span style=\"color: #333399;\"> }<\/span>\r\n<span style=\"color: #333399;\"> }\r\n\r\n<span style=\"color: #800000;\"><strong>C\u00f3digo en formato .txt -&gt; <span style=\"color: #800000;\"><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2013\/06\/PageRank.txt\" target=\"_blank\">PageRank\r\n\r\n<\/a><\/span><\/strong><\/span><\/span><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Os dejo el c\u00f3digo fuente realizado en C# del algoritmo de c\u00e1lculo de Pagerank de un sitio de google. Pod\u00e9is compilarlo, generar una DLL y usarlo en cualquier proyecto . NET que necesit\u00e9is independientemente del lenguaje usado. Este es el c\u00f3digo al detalle.<\/p>\n","protected":false},"author":1,"featured_media":2483,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,14],"tags":[669,428,659],"class_list":["post-4998","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo","category-varios","tag-google","tag-pagerank","tag-seo"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/4998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=4998"}],"version-history":[{"count":15,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/4998\/revisions"}],"predecessor-version":[{"id":5020,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/4998\/revisions\/5020"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/2483"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=4998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=4998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=4998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}