Java版PageRank及网站收录情况查询代码

  
  在Google这个由10的100次方得名的站点中,各种评估网站的算法层出不穷,而PageRank即是其中之一。

  Google的PageRank根据网站的外部链接和内部链接的数量和质量俩衡量网站的价值。PageRank背后的概念是,每个到页面的链接都是对该页面的一次投票,被链接的越多,就意味着被其他网站投票越多。这个就是所谓的“链接流行度”——衡量多少人愿意将他们的网站和你的网站挂钩。PageRank这个概念引自学术中一篇论文的被引述的频度——即被别人引述的次数越多,一般判断这篇论文的权威性就越高。

  通常情况下讲,原创内容越多的站点,PageRank越容易提升,反之则相对比较困难,PageRank最大上限值为10。在Google的评估中,能上10的网站真可谓凤毛麟角,即使算上Google,能成就PageRank 10这“伟业”者,望眼环球也不足40家。一般来说,个人站点评估值4即办的不错,商业网站到6以上便算步入正轨了。

  网上虽然有不少现成的查询器及源码,但是光用别人的毕竟不符合程序员风格,所以今天自己用Java重造轮子又写了个PageRank查询实现,捎带着把一些常用搜索引擎的网站链接及反向链接查询也加上了。

  源码如下:


   GooglePageRank.java
  1. package org.loon.test;
  2. import java.io.IOException;
  3. import java.util.Random;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. /**
  7.  * Copyright 2008
  8.  * 
  9.  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  10.  * use this file except in compliance with the License. You may obtain a copy of
  11.  * the License at
  12.  * 
  13.  * http://www.apache.org/licenses/LICENSE-2.0
  14.  * 
  15.  * Unless required by applicable law or agreed to in writing, software
  16.  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  17.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  18.  * License for the specific language governing permissions and limitations under
  19.  * the License.
  20.  * 
  21.  * @project loonframework
  22.  * @author chenpeng
  23.  * @email:ceponline@yahoo.com.cn
  24.  * @version 0.1
  25.  */
  26. public class GooglePageRank {
  27.     // google pagerank服务器ip地址列表(最近google小气了很多,反复查询一个封ip)
  28.     final static String[] GoogleServiceIP = new String[] { "64.233.161.100",
  29.             "64.233.161.101""64.233.183.91""64.233.189.44""66.102.1.103",
  30.             "66.102.9.115""66.249.89.83""66.249.91.99""66.249.93.190" };
  31.     // google用识别标记
  32.     final static private int GOOGLE_MAGIC = 0xE6359A60;
  33.     // ch数值混合器
  34.     private class CHMix {
  35.         int a;
  36.         int b;
  37.         int c;
  38.         public CHMix() {
  39.             this(000);
  40.         }
  41.         public CHMix(int a, int b, int c) {
  42.             this.a = a;
  43.             this.b = b;
  44.             this.c = c;
  45.         }
  46.     }
  47.     /**
  48.      * 按google要求混合成ch数据
  49.      * 
  50.      * @param mix
  51.      */
  52.     private static void mix(final CHMix mix) {
  53.         mix.a -= mix.b;
  54.         mix.a -= mix.c;
  55.         mix.a ^= mix.c >> 13;
  56.         mix.b -= mix.c;
  57.         mix.b -= mix.a;
  58.         mix.b ^= mix.a << 8;
  59.         mix.c -= mix.a;
  60.         mix.c -= mix.b;
  61.         mix.c ^= mix.b >> 13;
  62.         mix.a -= mix.b;
  63.         mix.a -= mix.c;
  64.         mix.a ^= mix.c >> 12;
  65.         mix.b -= mix.c;
  66.         mix.b -= mix.a;
  67.         mix.b ^= mix.a << 16;
  68.         mix.c -= mix.a;
  69.         mix.c -= mix.b;
  70.         mix.c ^= mix.b >> 5;
  71.         mix.a -= mix.b;
  72.         mix.a -= mix.c;
  73.         mix.a ^= mix.c >> 3;
  74.         mix.b -= mix.c;
  75.         mix.b -= mix.a;
  76.         mix.b ^= mix.a << 10;
  77.         mix.c -= mix.a;
  78.         mix.c -= mix.b;
  79.         mix.c ^= mix.b >> 15;
  80.     }
  81.     /**
  82.      * 获得ch数值混合器
  83.      * 
  84.      * @return
  85.      */
  86.     public static CHMix getInnerCHMix() {
  87.         return new GooglePageRank().new CHMix();
  88.     }
  89.     /**
  90.      * 通过url获得googlech(google数据库针对页面的全球唯一标识)
  91.      * 
  92.      * @param url
  93.      * @return
  94.      */
  95.     public static String GoogleCH(final String url) {
  96.         // 格式化为google要求的info:url模式
  97.         String nUrl = String.format("info:%s"new Object[] { url });
  98.         // 获得新url字符串格式
  99.         char[] urls = nUrl.toCharArray();
  100.         // 获得新url长度
  101.         int length = urls.length;
  102.         // 获得一个ch数值混合器
  103.         CHMix chMix = GooglePageRank.getInnerCHMix();
  104.         // 为c注入google识别标识
  105.         chMix.c = GOOGLE_MAGIC;
  106.         // 为a、b项注入google要求的初始标识
  107.         chMix.a = chMix.b = 0x9E3779B9;
  108.         int k = 0;
  109.         int len = length;
  110.         while (len >= 12) {
  111.             chMix.a += (int) (urls[k + 0] + (urls[k + 1] << 8)
  112.                     + (urls[k + 2] << 16) + (urls[k + 3] << 24));
  113.             chMix.b += (int) (urls[k + 4] + (urls[k + 5] << 8)
  114.                     + (urls[k + 6] << 16) + (urls[k + 7] << 24));
  115.             chMix.c += (int) (urls[k + 8] + (urls[k + 9] << 8)
  116.                     + (urls[k + 10] << 16) + (urls[k + 11] << 24));
  117.             // 获得混合运算后的数据
  118.             GooglePageRank.mix(chMix);
  119.             k += 12;
  120.             len -= 12;
  121.         }
  122.         chMix.c += length;
  123.         // 产生googlech的11位标识
  124.         switch (len) {
  125.         case 11:
  126.             chMix.c += (int) (urls[k + 10] << 24);
  127.         case 10:
  128.             chMix.c += (int) (urls[k + 9] << 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值