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

この例では、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);
}
}
参考文献
関数]**
http://www.burtleburtle.net/bob/hash/doobs.html
[Jenkins、Bob(ca.
2006)。 “ハッシュテーブルルックアップのためのハッシュ関数”。]**
http://www.burtleburtle.net/bob/hash/perfect.html
[Minimal Perfect
ハッシング]**
http://www.codeproject.com/Articles/20038/Request-Google-s-Page-rank-Programmatically
[Request
Googleのページランクはプログラム的に]** link://java/how-to-get-url-content-in-java/[URLコンテンツを取得する方法
Java]**
http://en.wikipedia.org/wiki/List
of
hash__functions—ハッシュの一覧
関数]
リンク://タグ/java/[java]リンク://タグ/ページランク/[ページランク]
seo