Möchte man die Möglichkeiten einer Internetsuche mit Google aus Java heraus benutzen können, so ist das zunächst recht schwer möglich, da Google keine Webservices anbietet, die diesen Zugriff ermöglichen. Google besitzt aber eine Schnittstelle um es Anwendungen des Web 2.0 zu ermöglichen, einen AJAX-Zugriff ihre Suchmaschine zu ermöglichen. Diese AJAX-Schnittstelle kann genutzt werden um über einen HTTP-Request die Suchmaschine mit Java aufzurufen.
Hierzu muss ein Google-API Key besorgt werden, welcher nach erfolgreicher Anmeldung kostenlos sein dürfte. Folgender Sourcecode erledigt diese Aufgabe
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class GoogleAJAXSearchAPI {
private static String URLHEADER = "\"unescapedUrl\":\"";
private static String TITLEHEADER = "\"titleNoFormatting\":\"";
private static String APIKEY = "--your own key here --";
private static String ENDPOINTURL = "http://www.google.com/uds/GwebSearch?"+
"callback=GwebSearch.Raw" +
"Completion&context=0&lstkp=0&rsz=large&hl=en&" +
"sig=8656f49c146c5220e273d16b4b6978b2";
public List<GoogleResult> search(String searchstring) {
SearchResultList results = new SearchResultList();
URLConnection uc;
HttpURLConnection connection = null;
InputStream inputStream = null;
StringBuffer output = new StringBuffer();
String endpoint = null;
try {
searchstring = searchstring.replace(" ", "+");
endpoint = ENDPOINTURL + "&amp;q=" + searchstring + "&amp;key=" + APIKEY
+ "&amp;v=1.0";
uc = new URL(endpoint).openConnection();
connection = (HttpURLConnection) uc;
connection.setDoOutput(true);
connection.setRequestMethod("GET");
connection.connect();
String line;
inputStream = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(
inputStream));
while ((line = rd.readLine()) != null) {
output.append(line);
}
inputStream.close();
// System.out.println(endpoint);
return processResult(output.toString());
} catch (Exception e1) {
System.err.println("Error while searching Google:");
e1.printStackTrace();
}
return results;
}
private List<GoogleResult> processResult(String resultset) {
List<GoogleResult> searchResults = new ArrayList<GoogleResult>();
StringTokenizer stringTokenizer = new StringTokenizer(resultset, ",{");
String next;
String url = null;
String title = null;
while (stringTokenizer.hasMoreTokens()) {
next = stringTokenizer.nextToken();
if (next.startsWith(URLHEADER))
url = next.substring(URLHEADER.length(), next.length() - 1);
else if (next.startsWith(TITLEHEADER))
title = next.substring(TITLEHEADER.length(), next.length() - 1);
if (url != null &amp;&amp; title != null) {
searchResults.add(new GoogleResult(title, url));
url = null;
title = null;
}
}
return searchResults;
}
public static void main(String[] args) throws Exception {
String search = "sin maastricht";
GoogleAJAXSearchAPI googleAPI = new GoogleAJAXSearchAPI();
List<GoogleResult> results = googleAPI.search(search);
System.out.println("Results for search for "+search);
for(GoogleResult result : results) {
System.out.println(result);
}
}
}
Es wird auch die kleine Klasse GoogleResult benötigt, die ein solches Result abspeichert:
public class GoogleResult {
private String url, title;
public GoogleResult (String title, String url)
{
setTitle(title);
this.url = url;
}
private void setTitle (String title)
{
this.title = title;
}
public String getTitle () {
return title;
}
public String getUrlString() {
return url;
}
@Override
public String toString() {
return (title + "\t" + url);
}
public boolean equals (GoogleResult r)
{
if (r.getUrlString().equals(url))
return true;
return false;
}
}