Réponses:
Quelques faits:
Google propose une API de service Web de recherche publique qui renvoie JSON : http://ajax.googleapis.com/ajax/services/search/web . Documentation ici
Java propose java.net.URL
et java.net.URLConnection
pour déclencher et gérer les requêtes HTTP.
JSON peut en Java être converti en un objet Javabean digne de ce nom à l'aide d'une API Java JSON arbitraire. L'un des meilleurs est Google Gson .
Maintenant, faites le calcul:
public static void main(String[] args) throws Exception {
String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
String search = "stackoverflow";
String charset = "UTF-8";
URL url = new URL(google + URLEncoder.encode(search, charset));
Reader reader = new InputStreamReader(url.openStream(), charset);
GoogleResults results = new Gson().fromJson(reader, GoogleResults.class);
// Show title and URL of 1st result.
System.out.println(results.getResponseData().getResults().get(0).getTitle());
System.out.println(results.getResponseData().getResults().get(0).getUrl());
}
Avec cette classe Javabean représentant les données JSON les plus importantes telles que renvoyées par Google (elle renvoie en fait plus de données, mais c'est à vous de jouer en tant qu'exercice pour développer ce code Javabean en conséquence):
public class GoogleResults {
private ResponseData responseData;
public ResponseData getResponseData() { return responseData; }
public void setResponseData(ResponseData responseData) { this.responseData = responseData; }
public String toString() { return "ResponseData[" + responseData + "]"; }
static class ResponseData {
private List<Result> results;
public List<Result> getResults() { return results; }
public void setResults(List<Result> results) { this.results = results; }
public String toString() { return "Results[" + results + "]"; }
}
static class Result {
private String url;
private String title;
public String getUrl() { return url; }
public String getTitle() { return title; }
public void setUrl(String url) { this.url = url; }
public void setTitle(String title) { this.title = title; }
public String toString() { return "Result[url:" + url +",title:" + title + "]"; }
}
}
java.net.URLConnection
Mis à jour depuis novembre 2010 (2 mois après la réponse ci-dessus), le service Web de recherche publique est devenu obsolète (et le dernier jour où le service a été offert était le 29 septembre 2014). Votre meilleur pari est maintenant d'interroger http://www.google.com/search directement avec un agent utilisateur honnête, puis d'analyser le résultat à l'aide d'un analyseur HTML . Si vous omettez l'agent utilisateur, vous récupérez un 403. Si vous mentez dans l'agent utilisateur et que vous simulez un navigateur Web (par exemple Chrome ou Firefox), vous obtenez une réponse HTML beaucoup plus grande, ce qui est un gaspillage de bande passante et de performances.
Voici un exemple de lancement utilisant Jsoup comme analyseur HTML:
String google = "http://www.google.com/search?q=";
String search = "stackoverflow";
String charset = "UTF-8";
String userAgent = "ExampleBot 1.0 (+http://example.com/bot)"; // Change this to your company's name and bot homepage!
Elements links = Jsoup.connect(google + URLEncoder.encode(search, charset)).userAgent(userAgent).get().select(".g>.r>a");
for (Element link : links) {
String title = link.text();
String url = link.absUrl("href"); // Google returns URLs in format "http://www.google.com/url?q=<url>&sa=U&ei=<someKey>".
url = URLDecoder.decode(url.substring(url.indexOf('=') + 1, url.indexOf('&')), "UTF-8");
if (!url.startsWith("http")) {
continue; // Ads/news/etc.
}
System.out.println("Title: " + title);
System.out.println("URL: " + url);
}
Pour rechercher Google à l'aide de l'API, vous devez utiliser la recherche personnalisée Google , le scraping de page Web n'est pas autorisé
En java, vous pouvez utiliser la bibliothèque cliente de l'API CustomSearch pour Java
La dépendance maven est:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-customsearch</artifactId>
<version>v1-rev57-1.23.0</version>
</dependency>
Exemple de recherche de code à l'aide de la bibliothèque cliente de l'API Google CustomSearch
public static void main(String[] args) throws GeneralSecurityException, IOException {
String searchQuery = "test"; //The query to search
String cx = "002845322276752338984:vxqzfa86nqc"; //Your search engine
//Instance Customsearch
Customsearch cs = new Customsearch.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), null)
.setApplicationName("MyApplication")
.setGoogleClientRequestInitializer(new CustomsearchRequestInitializer("your api key"))
.build();
//Set search parameter
Customsearch.Cse.List list = cs.cse().list(searchQuery).setCx(cx);
//Execute search
Search result = list.execute();
if (result.getItems()!=null){
for (Result ri : result.getItems()) {
//Get title, link, body etc. from search
System.out.println(ri.getTitle() + ", " + ri.getLink());
}
}
}
Comme vous pouvez le voir, vous devrez demander une clé API et configurer votre propre identifiant de moteur de recherche, cx .
Notez que vous pouvez effectuer une recherche sur tout le Web en sélectionnant "Rechercher sur le Web entier" dans les paramètres de base de l'onglet lors de la configuration de cx, mais les résultats ne seront pas exactement les mêmes que ceux d'une recherche Google normale dans un navigateur.
Actuellement (date de réponse), vous recevez 100 appels API par jour gratuitement, puis Google aime partager vos bénéfices.
Dans les conditions d'utilisation de google, nous pouvons lire:
5.3 Vous acceptez de ne pas accéder (ou tenter d'accéder) à l'un des Services par tout moyen autre que via l'interface fournie par Google, sauf si vous avez été spécifiquement autorisé à le faire dans un accord séparé avec Google. Vous acceptez spécifiquement de ne pas accéder (ou tenter d'accéder) à l'un des Services par tout moyen automatisé (y compris l'utilisation de scripts ou de robots d'exploration Web) et vous vous assurerez de vous conformer aux instructions énoncées dans tout fichier robots.txt présent sur les Services. .
Donc je suppose que la réponse est non. Plus sur l' API SOAP n'est plus disponible
Google TOS a été un peu assoupli en avril 2014. Maintenant, il indique:
"N'abusez pas de nos Services. Par exemple, n'interférez pas avec nos Services ou n'essayez pas d'y accéder en utilisant une méthode autre que l'interface et les instructions que nous fournissons."
Ainsi, le passage sur les «moyens automatisés» et les scripts a disparu. Ce n'est évidemment toujours pas le moyen souhaité (par Google) d'accéder à leurs services, mais je pense qu'il est maintenant formellement ouvert à l'interprétation de ce qu'est exactement une "interface" et si cela fait une différence quant à la façon dont exactement le HTML renvoyé est traité ( rendu ou analysé). Quoi qu'il en soit, j'ai écrit une bibliothèque de commodité Java et c'est à vous de décider de l'utiliser ou non:
En effet, il existe une API pour rechercher google par programmation. L'API s'appelle la recherche personnalisée Google. Pour utiliser cette API, vous aurez besoin d'une clé API Google Developer et d'une clé cx. Une procédure simple pour accéder à la recherche Google à partir du programme java est expliquée dans mon blog.
Maintenant mort, voici le lien Wayback Machine .
Comme alternative à la réponse BalusC car elle est obsolète et que vous devez utiliser des proxies, vous pouvez utiliser ce package. Exemple de code:
Map<String, String> parameter = new HashMap<>();
parameter.put("q", "Coffee");
parameter.put("location", "Portland");
GoogleSearchResults serp = new GoogleSearchResults(parameter);
JsonObject data = serp.getJson();
JsonArray results = (JsonArray) data.get("organic_results");
JsonObject first_result = results.get(0).getAsJsonObject();
System.out.println("first coffee: " + first_result.get("title").getAsString());
Bibliothèque sur GitHub
À la lumière de ces modifications du TOS l'année dernière, nous avons créé une API qui donne accès à la recherche de Google. C'était pour notre propre usage mais après quelques demandes, nous avons décidé de l'ouvrir. Nous prévoyons d'ajouter des moteurs de recherche supplémentaires à l'avenir!
Si quelqu'un cherche un moyen simple d'implémenter / d'acquérir des résultats de recherche, vous êtes libre de vous inscrire et d'essayer l'API REST: https://searchapi.io
Il renvoie des résultats JSON et devrait être assez facile à implémenter avec les documents détaillés.
C'est dommage que Bing et Yahoo aient des kilomètres d'avance sur Google à cet égard. Leurs API ne sont pas bon marché, mais au moins disponibles.
Juste une alternative. La recherche sur Google et l'analyse des résultats peuvent également être effectuées de manière générique à l'aide de n'importe quel analyseur HTML tel que Jsoup en Java. Voici le lien vers l'exemple mentionné.
https://www.codeforeach.com/java/example-how-to-search-google-using-java