JavaでGoogle PageRank(PR)を取得する方法

googleページランク、幅= 215、高さ= 215

この例では、JavaでGoogle PageRank(PR)を取得する方法を示します。 「mkyong.com」のPageRankをリクエストするには、次のHTTPリクエストを送信するだけです。

http://toolbarqueries.google.com/tbr?client=navclient-auto&hl=en&ch=6236440745
&ie=UTF-8&oe=UTF-8&features=Rank&q=info:mkyong.com

P.S上記URLはGoogleツールバープラグインで使用されています.

トリッキーな部分は、以下のハッシング値です。

ch=6236440745

GoogleはBob Jenkinsハッシュアルゴリズムを使用しています[ 1 ][ http://en.wikipedia.org/wiki/Jenkins hash function[2]]

URLをハッシュし、上記の " ch "値を生成する。

1. PageRank(PR)Javaの例

ウェブサイト "mkyong.com"のGoogle PRを入手してください。

GoogleSeoHelper.java

package com.mkyong;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import com.mkyong.hash.JenkinsHash;

public class GoogleSeoHelper {

  public static void main(String[]args) {

    GoogleSeoHelper obj = new GoogleSeoHelper();
    System.out.println(obj.getPR("mkyong.com"));

  }

  public int getPR(String domain) {

    String result = "";

    JenkinsHash jenkinsHash = new JenkinsHash();
    long hash = jenkinsHash.hash(("info:" + domain).getBytes());

   //Append a 6 in front of the hashing value.
    String url = "http://toolbarqueries.google.com/tbr?client=navclient-auto&hl=en&"
       + "ch=6" + hash + "&ie=UTF-8&oe=UTF-8&features=Rank&q=info:" + domain;

    System.out.println("Sending request to : " + url);

    try {
        URLConnection conn = new URL(url).openConnection();

        BufferedReader br = new BufferedReader(new InputStreamReader(
            conn.getInputStream()));

        String input;
        while ((input = br.readLine()) != null) {

           //What Google returned? Example : Rank__1:1:9, PR = 9
            System.out.println(input);

            result = input.substring(input.lastIndexOf(":") + 1);
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    if ("".equals(result)) {
        return 0;
    } else {
        return Integer.valueOf(result);
    }

  }

}

出力 - URL "mkyong.com"のPageRankが5です!

Sending request to : http://toolbarqueries.google.com/tbr?client=navclient-auto
&hl=en&ch=6236440745&ie=UTF-8&oe=UTF-8&features=Rank&q=info:mkyong.com
Rank__1:1:5
5

2.ジェンキンスパーフェクトハッシングアルゴリズム

JenkinsのハッシュJavaポートの例を以下に示します。

JenkinsHash.java

package com.mkyong.hash;
/** **
 **  Hash algorithm by Bob Jenkins, 1996.
 **
 **  You may use this code any way you wish, private, educational, or commercial.
 **  It's free. See: http://burtleburtle.net/bob/hash/doobs.html
 **
 ** /public class JenkinsHash {

   //max value to limit it to 4 bytes
    private static final long MAX__VALUE = 0xFFFFFFFFL;

   //internal variables used in the various calculations
    long a;
    long b;
    long c;

   /** **
     **  Convert a byte into a long value without making it negative.
     ** /    private long byteToLong(byte b) {
        long val = b & 0x7F;
        if ((b & 0x80) != 0) {
            val += 128;
        }
        return val;
    }

   /** **
     **  Do addition and turn into 4 bytes.
     ** /    private long add(long val, long add) {
        return (val + add) & MAX__VALUE;
    }

   /** **
     **  Do subtraction and turn into 4 bytes.
     ** /    private long subtract(long val, long subtract) {
        return (val - subtract) & MAX__VALUE;
    }

   /** **
     **  Left shift val by shift bits and turn in 4 bytes.
     ** /    private long xor(long val, long xor) {
        return (val ^ xor) & MAX__VALUE;
    }

   /** **
     **  Left shift val by shift bits. Cut down to 4 bytes.
     ** /    private long leftShift(long val, int shift) {
        return (val << shift) & MAX__VALUE;
    }

   /** **
     **  Convert 4 bytes from the buffer at offset into a long value.
     ** /    private long fourByteToLong(byte[]bytes, int offset) {
        return (byteToLong(bytes[offset + 0])
        + (byteToLong(bytes[offset + 1]) << 8)
        + (byteToLong(bytes[offset + 2]) << 16) + (byteToLong(bytes[offset + 3]) << 24));
    }

   /** **
     **  Mix up the values in the hash function.
     ** /    private void hashMix() {
        a = subtract(a, b);
        a = subtract(a, c);
        a = xor(a, c >> 13);
        b = subtract(b, c);
        b = subtract(b, a);
        b = xor(b, leftShift(a, 8));
        c = subtract(c, a);
        c = subtract(c, b);
        c = xor(c, (b >> 13));
        a = subtract(a, b);
        a = subtract(a, c);
        a = xor(a, (c >> 12));
        b = subtract(b, c);
        b = subtract(b, a);
        b = xor(b, leftShift(a, 16));
        c = subtract(c, a);
        c = subtract(c, b);
        c = xor(c, (b >> 5));
        a = subtract(a, b);
        a = subtract(a, c);
        a = xor(a, (c >> 3));
        b = subtract(b, c);
        b = subtract(b, a);
        b = xor(b, leftShift(a, 10));
        c = subtract(c, a);
        c = subtract(c, b);
        c = xor(c, (b >> 15));
    }

   /** **
     **  Hash a variable-length key into a 32-bit value. Every bit of the key
     **  affects every bit of the return value. Every 1-bit and 2-bit delta
     **  achieves avalanche. The best hash table sizes are powers of 2.
     **
     **  @param buffer
     **             Byte array that we are hashing on.
     **  @param initialValue
     **             Initial value of the hash if we are continuing from a previous
     **             run. 0 if none.
     **  @return Hash value for the buffer.
     ** /    public long hash(byte[]buffer, long initialValue) {
        int len, pos;

       //set up the internal state
       //the golden ratio; an arbitrary value
        a = 0x09e3779b9L;
       //the golden ratio; an arbitrary value
        b = 0x09e3779b9L;
       //the previous hash value

       //c = initialValue;
        c = 0x0E6359A60L;

       //handle most of the key
        pos = 0;
        for (len = buffer.length; len >= 12; len -= 12) {
            a = add(a, fourByteToLong(buffer, pos));
            b = add(b, fourByteToLong(buffer, pos + 4));
            c = add(c, fourByteToLong(buffer, pos + 8));
            hashMix();
            pos += 12;
        }

        c += buffer.length;

       //all the case statements fall through to the next on purpose
        switch (len) {
        case 11:
            c = add(c, leftShift(byteToLong(buffer[pos + 10]), 24));
        case 10:
            c = add(c, leftShift(byteToLong(buffer[pos + 9]), 16));
        case 9:
            c = add(c, leftShift(byteToLong(buffer[pos + 8]), 8));
           //the first byte of c is reserved for the length
        case 8:
            b = add(b, leftShift(byteToLong(buffer[pos + 7]), 24));
        case 7:
            b = add(b, leftShift(byteToLong(buffer[pos + 6]), 16));
        case 6:
            b = add(b, leftShift(byteToLong(buffer[pos + 5]), 8));
        case 5:
            b = add(b, byteToLong(buffer[pos + 4]));
        case 4:
            a = add(a, leftShift(byteToLong(buffer[pos + 3]), 24));
        case 3:
            a = add(a, leftShift(byteToLong(buffer[pos + 2]), 16));
        case 2:
            a = add(a, leftShift(byteToLong(buffer[pos + 1]), 8));
        case 1:
            a = add(a, byteToLong(buffer[pos + 0]));
           //case 0: nothing left to add
        }
        hashMix();

        return c;
    }

   /** **
     **  See hash(byte[]buffer, long initialValue)
     **
     **  @param buffer
     **             Byte array that we are hashing on.
     **  @return Hash value for the buffer.
     ** /    public long hash(byte[]buffer) {
        return hash(buffer, 0);
    }
}

参考文献

2006)。 "ハッシュテーブルルックアップのためのハッシュ関数"。]** http://www.burtleburtle.net/bob/hash/perfect.html [Minimal Perfect

Googleのページランクはプログラム的に]** link://java/how-to-get-url-content-in-java/[URLコンテンツを取得する方法

Java]** http://en.wikipedia.org/wiki/List of hash__functions—​ハッシュの一覧

関数]

リンク://タグ/java/[java]リンク://タグ/ページランク/[ページランク] seo