How to get Google PageRank (PR) in Java

google pagerank

In this example, we will show you how to get Google PageRank (PR) in Java. To request a PageRank for “mkyong.com”, you just need to send following HTTP request :


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 Above URL is used by Google toolbar plugin.

The tricky part is following hashing value :


ch=6236440745

Google is using Bob Jenkins hashing algorithm [1][2] to hash the URL and generate above “ch” value.

1. PageRank (PR) + Java Example

Get Google PR for website “mkyong.com”.

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);
	}

  }

}

Output – The URL “mkyong.com” has PageRank of 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 Perfect Hashing Algorithm

Here’s the Jenkins hash Java port example.

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);
	}
}

References

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

Leave a Reply

avatar
newest oldest most voted
Raju
Guest
Raju

It is giving 0(ZERO) to every site whatever i have given as input pl z give me alternative.

guest
Guest
guest

it was working for me up to about 4 months ago. i think google must not e allowing their api to be accessed anymore by the public

Marcus
Guest
Marcus

Some sites gives the result of -1, i.e. it didnt fetch the pagerank. but my google toolbar-plugin shows it when I browse that site.

like https://www.consumer.org.nz/products/espresso-machines/overview

gives no result. why?

Andreas
Guest
Andreas

Thanks for that code, realy nice! But don´t forget to URL-encode the URLs! (Hash the unencoded URL but send it encoded…)

domain = java.net.URLEncoder.encode(domain);

SSC
Guest
SSC
Mathématique et informatique: 1. les fonctions de Haar rationalisées pour estimer la solution d?un syst?me d?’equations intégro-différentielles http://bu.univ-ouargla.dz/Fonctions_Haar.pdf?idthese=986 2. Résolution de système d’équations intégro-différentielles par la méthode des fonctions de Haar rationalisées http://bu.univ-ouargla.dz/ABBASSI_HOCINE.pdf?idthese=811 3. ETUDE DE QUELQUES PROBLEMES ELLIPTIQUES NON LINEAIRES http://bu.univ-ouargla.dz/FAREH_Abdelfeteh.pdf?idthese=730 4. Signatures numériques pour fichiers audio (audio watermarking) http://bu.univ-ouargla.dz/Abderrahmane_ADJILA.pdf?idthese=3063 5. Simulation et Gestion : Vers un modèle de pilotage stratégique des entreprises économiques http://bu.univ-ouargla.dz/ali_lalouci.pdf?idthese=2001 6. Etude De Quelques Équations D’évolution Qui Surviennent Comme Des Équations Des Géodésiques Sur Les Groupes Des Difféomorphismes http://bu.univ-ouargla.dz/BEDIDA_Nabila.pdf?idthese=729 7. Sur la résolution du problème de Laplace perturbé dans un polygone plan, par décomposition… Read more »
SSC
Guest
SSC
*Séminaire International sur la Biodiversite Faunistique en Zones Arides et Semi-arides 22 au 24 novembre 2009: 1- VARIATION DU REGIME ALIMENTAIRE DES MALES ET DES FEMELLES DE SCHISTOCERCA GREGARIA (ACRIDIDAE, CYRTACANTACRIDINAE) DANS LE SAHARA CENTRALE D’ALGERIE http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/42-s%C3%A9minaire-international-sur-la-biodiversite-faunistique-en-zones-arides-et-semi-arides-22-au-24-novembre-2009/531-variation-du-regime-alimentaire-des-males-et-des-femelles-de-schistocerca-gregaria-acrididae,-cyrtacantacridinae-dans-le-sahara-centrale-d%E2%80%99algerie.html 2- BIODIVERSITE & PROTECTION DE LA NATURE UNE DERIVE SEMANTIQUE DANGEREUSE http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/42-s%C3%A9minaire-international-sur-la-biodiversite-faunistique-en-zones-arides-et-semi-arides-22-au-24-novembre-2009/530-biodiversite-protection-de-la-nature-une-derive-semantique-dangereuse.html 3- BIOECOLOGIE DE QUELQUES ESPECES DE MANTODEA DANS LA REGION D’OUARGLA (SAHARA ALGERIEN) http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/42-s%C3%A9minaire-international-sur-la-biodiversite-faunistique-en-zones-arides-et-semi-arides-22-au-24-novembre-2009/499-bioecologie-de-quelques-especes-de-mantodea-dans-la-region-d%E2%80%99ouargla-sahara-algerien.html 4- INVENTAIRE DE L’AVIFAUNE DE LA ZONE HUMIDE DE SBIKHA DANS LA REGION SEMI-ARIDE DE KHENCHELA http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/42-s%C3%A9minaire-international-sur-la-biodiversite-faunistique-en-zones-arides-et-semi-arides-22-au-24-novembre-2009/496-inventaire-de-l%E2%80%99avifaune-de-la-zone-humide-de-sbikha-dans-la-region-semi-aride-de-khenchela.html 5- PLACE DES INSECTES DANS LE MENU TROPHIQUE DES JEUNES DU MOINEAU HYBRIDE (PASSER DOMESTICUS X P. HISPANIOLENSIS) DANS LA… Read more »
SSC
Guest
SSC
* DEUXIEME JOURNEE DOCTORALE 16 AVRIL 2012 : 1- Rôle du dromadaire dans la régénération et la prolifération du couvert floristique des parcours du Sahara septentrional algérien http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/45-deuxieme-journee-doctorale-16-avril-2012/604-r%C3%B4le-du-dromadaire-dans-la-r%C3%A9g%C3%A9n%C3%A9ration-et-la-prolif%C3%A9ration-du-couvert-floristique-des-parcours-du-sahara-septentrional-alg%C3%A9rien.html 2- BIO-ECOLOGIE ET CARACTERES PHYSIOLOGIQUES DES GRAINES DES PLANTES SPONTANEES DU SAHARA SEPTENTRIONAL : CAS DE LA REGION DE OUARGLAhttp://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/45-deuxieme-journee-doctorale-16-avril-2012/602-bio-ecologie-et-caracteres-physiologiques-des-graines-des-plantes-spontanees-du-sahara-septentrional-cas-de-la-region-de-ouargla.html 3- Caractérisation des stratégies d’adaptation à la sècheresse des principales espèces spontanées vivaces du Sahara septentrional algérien http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/45-deuxieme-journee-doctorale-16-avril-2012/599-caract%C3%A9risation-des-strat%C3%A9gies-d%E2%80%99adaptation-%C3%A0-la-s%C3%A8cheresse-des-principales-esp%C3%A8ces-spontan%C3%A9es-vivaces-du-sahara-septentrional-alg%C3%A9rien.html 4- Développement de bioproduits diététiques à base de dattes molles communes les plus répandus dans la cuvette d’ Ouargla (variété Ghars) http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/45-deuxieme-journee-doctorale-16-avril-2012/598-d%C3%A9veloppement-de-bioproduits-di%C3%A9t%C3%A9tiques-%C3%A0-base-de-dattes-molles-communes-les-plus-r%C3%A9pandus-dans-la-cuvette-d%E2%80%99-ouargla-vari%C3%A9t%C3%A9-ghars.html 5- IMPACT DES MANTES SUR LA POPULATION D’INSECTES DANS UN ECOSYSTEME DE… Read more »
SSC
Guest
SSC
Théses de Doctorat 1. Elaboration et Caractérisations des Couches Minces Zno par Pyrolyse-Pulvérisation par Ultrasons et Applications http://bu.univ-ouargla.dz/Theses%20DOCTORAT/Ahmed_Djafour_Doctorat.pdf 2. Etude d’un systeme de production d’hydrogéne solaire http://bu.univ-ouargla.dz/Theses%20DOCTORAT/BOUZID_KHEDIDJA.pdf 3. Etude des effets microscopiques de l’opacité et de la non homogénéité des champs électriques locaux sur la redistribution du rayonnement dans les plasmas denses et chauds http://bu.univ-ouargla.dz/Theses%20DOCTORAT/CHENINI%20Keltoum_Doctorat.pdf 4. Chemical constituents of flora of algeria–chemical constituents of pergularia tomentosa. L http://bu.univ-ouargla.dz/Theses%20DOCTORAT/Sekhri_Lakhdar_Doctorat.pdf 5. Etude des causes d’augmentation de la température dans une pile à oxyde solide (SOFC): Etude bidimensionnelle du champ de température http://bu.univ-ouargla.dz/Theses%20DOCTORAT/Hocine_Mahcene.pdf 6. Aux confins de la littérature, de l’encyclopédie et de… Read more »
SSC
Guest
SSC
* Séminaire Workshop sur l’Agriculture Saharienne : Enjeux et Perspectives Université Kasdi Merbah – Ouargla – le 03 mai 2010 : 1- La gestion des potentialités hydriques en régions sahariennes http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/36-workshop-sur-l%E2%80%99agriculture-saharienne-enjeux-et-perspectives-universit%C3%A9-kasdi-merbah-%E2%80%93-ouargla-le-03-mai-2010/466-la-gestion-des-potentialit%C3%A9s-hydriques-en-r%C3%A9gions-sahariennes.html 2- Dysfonctionnement des élevages dans les régions sahariennes http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/36-workshop-sur-l%E2%80%99agriculture-saharienne-enjeux-et-perspectives-universit%C3%A9-kasdi-merbah-%E2%80%93-ouargla-le-03-mai-2010/465-dysfonctionnement-des-%C3%A9levages-dans-les-r%C3%A9gions-sahariennes.html 3- La céréaliculture sous centre-pivot dans les régions sahariennes : cas de la region de ouargla http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/36-workshop-sur-l%E2%80%99agriculture-saharienne-enjeux-et-perspectives-universit%C3%A9-kasdi-merbah-%E2%80%93-ouargla-le-03-mai-2010/464-la-c%C3%A9r%C3%A9aliculture-sous-centre-pivot-dans-les-r%C3%A9gions-sahariennes-cas-de-la-region-de-ouargla.html 4- La dynamique agricole dans la zone d’El Ghrous (Biskra) : entre le boom maraîcher et la lente généralisation des systèmes de production phoenicicoles http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/36-workshop-sur-l%E2%80%99agriculture-saharienne-enjeux-et-perspectives-universit%C3%A9-kasdi-merbah-%E2%80%93-ouargla-le-03-mai-2010/463-la-dynamique-agricole-dans-la-zone-d-el-ghrous-biskra-entre-le-boom-mara%C3%AEcher-et-la-lente-g%C3%A9n%C3%A9ralisation-des-syst%C3%A8mes-de-production-phoenicicoles.html 5- L’état phytosanitaire des palmeraies algériennes,principaux axes de recherche/développement à prendre en charge http://manifest.univ-ouargla.dz/index.php/seminaires/archive/facult%C3%A9-des-sciences-de-la-nature-et-de-la-vie-et-des-sciences-de-la-terre-et-de-l-univers/36-workshop-sur-l%E2%80%99agriculture-saharienne-enjeux-et-perspectives-universit%C3%A9-kasdi-merbah-%E2%80%93-ouargla-le-03-mai-2010/462-l%E2%80%99%C3%A9tat-phytosanitaire-des-palmeraies-alg%C3%A9riennes,-principaux-axes-de-recherche-d%C3%A9veloppement-%C3%A0-prendre-en-charge.html 6- Gestion participative des… Read more »
SSC
Guest
SSC
Deepak
Guest
Deepak

Worked for me

sa
Guest
sa

Hi Rahu,

IT is working you sould try it with AsyncTask.

Sree
Guest
Sree

I was checking for this,Will try it!!!Thanks.

Rahu
Guest
Rahu

I used the code in android .its not working ?
Is there any API for doing this in Android?

trackback
How to get Alexa Ranking In Java

[…] How to get Google PageRank in Java […]