106 votes

Comment rechercher Google Programmable Java API

Est-ce que quelqu'un sait s'il est possible de rechercher sur Google de manière programmable - en particulier s'il existe une API Java pour cela ?

0 votes

Avez-vous du support pour nodejs?

0 votes

Exemple de recherche sur Google en utilisant Java - Jsoup HTML Parser : codeforeach.com/java/example-how-to-search-google-using-java

0 votes

Pourquoi est-ce toujours fermé?

139voto

BalusC Points 498232

Quelques faits :

  1. Google propose une API de service de recherche publique qui renvoie du JSON : http://ajax.googleapis.com/ajax/services/search/web. Documentation ici

  2. Java propose java.net.URL et java.net.URLConnection pour envoyer et gérer des requêtes HTTP.

  3. JSON peut être converti en Java en un objet Javabean complet en utilisant une API JSON Java arbitraire. L'un des meilleurs est Google Gson.

Faisons maintenant 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);

    // Afficher le titre et l'URL du 1er résultat.
    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 renvoyées par Google (elle renvoie en fait plus de données, mais il vous appartient en exercice d'étendre 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 results;
        public List getResults() { return results; }
        public void setResults(List 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 + "]"; }
    }

}

Voir aussi :


Mise à jour depuis novembre 2010 (2 mois après la réponse ci-dessus), le service de recherche publique est devenu obsolète (et le dernier jour où le service a été offert était le 29 septembre 2014). Votre meilleure option est maintenant de faire une requête directement sur http://www.google.com/search avec un agent utilisateur honnête et d'analyser le résultat à l'aide d'un parseur HTML. Si vous omettez l'agent utilisateur, vous obtenez une erreur 403. Si vous mentez dans l'agent utilisateur et simulez un navigateur web (par exemple Chrome ou Firefox), vous obtenez une réponse HTML beaucoup plus volumineuse, ce qui est une perte de bande passante et de performances.

Voici un exemple de départ utilisant Jsoup comme parseur 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 retourne des URL au format "http://www.google.com/url?q=&sa=U&ei=".
    url = URLDecoder.decode(url.substring(url.indexOf('=') + 1, url.indexOf('&')), "UTF-8");

    if (!url.startsWith("http")) {
        continue; // Publicités/actualités/etc.
    }

    System.out.println("Titre : " + title);
    System.out.println("URL : " + url);
}

0 votes

Merci beaucoup - cela ne viole-t-il pas l'accord de licence mentionné dans la réponse ci-dessus? J'apprécie vraiment le code!

0 votes

Non, voir aussi documentation avec un exemple en Java.

11 votes

Veuillez noter que l'API de recherche Google est devenue obsolète depuis novembre 2010 (2 mois après la publication de la réponse ci-dessus). Les utilisateurs sont encouragés à passer à l'API de recherche personnalisée Google: developers.google.com/custom-search/v1/overview

15voto

Petter Friberg Points 14931

Pour rechercher sur Google en utilisant l'API, vous devriez utiliser Google Custom Search, le scraping de pages web n'est pas autorisé

En java, vous pouvez utiliser CustomSearch API Client Library for Java

La dépendance Maven est:

    com.google.apis
    google-api-services-customsearch
    v1-rev57-1.23.0

Exemple de code recherchant à l'aide de Google CustomSearch API Client Library

public static void main(String[] args) throws GeneralSecurityException, IOException {

    String searchQuery = "test"; //La requête à rechercher
    String cx = "002845322276752338984:vxqzfa86nqc"; //Votre moteur de recherche

    //Instance Customsearch
    Customsearch cs = new Customsearch.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), null) 
                   .setApplicationName("MyApplication") 
                   .setGoogleClientRequestInitializer(new CustomsearchRequestInitializer("votre clé api")) 
                   .build();

    //Définir le paramètre de recherche
    Customsearch.Cse.List list = cs.cse().list(searchQuery).setCx(cx); 

    //Exécuter la recherche
    Search result = list.execute();
    if (result.getItems()!=null){
        for (Result ri : result.getItems()) {
            //Obtenir le titre, le lien, le contenu, etc. de la recherche
            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 rechercher sur l'ensemble du web en sélectionnant "Recherche sur l'ensemble du web" dans les paramètres de base lors de la configuration de cx, mais les résultats ne seront pas exactement les mêmes qu'une recherche Google normale dans un navigateur.

Actuellement (date de la réponse), vous avez droit à 100 appels API gratuits par jour, puis Google aime partager vos profits.

12voto

Manuel Selva Points 5760

Dans les Conditions d'utilisation de Google, nous pouvons lire :

5.3 Vous acceptez de ne pas accéder (ou de tenter d'accéder) à l'un des Services par un moyen autre que par l'interface fournie par Google, sauf si vous avez été expressément autorisé à le faire dans le cadre d'un accord séparé avec Google. Vous vous engagez expressément à ne pas accéder (ou de tenter d'accéder) à l'un des Services par des moyens automatisés (y compris l'utilisation de scripts ou de robots d'exploration Web) et veillerez à vous conformer aux instructions figurant dans tout fichier robots.txt présent sur les Services.

Donc je suppose que la réponse est Non. De plus, l'API SOAP n'est plus disponible

7 votes

Cependant, l'API AJAX est fournie par Google - et doit donc être utilisable sans violer ces conditions d'utilisation.

0 votes

Cela s'applique probablement aux robots qui n'utilisent pas l'API.

3voto

Alex Fedulov Points 342

Les conditions d'utilisation de Google ont été assouplies un peu en avril 2014. Maintenant, cela indique :

"N'utilisez pas nos Services de manière abusive. Par exemple, n'interférez pas avec nos Services ou essayez 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 maintenant disparu. Il n'est évidemment toujours pas la méthode souhaitée (par Google) pour accéder à leurs services, mais je pense qu'il est désormais officiellement ouvert à l'interprétation de ce qu'est exactement une "interface" et si cela fait une différence sur la manière dont le HTML renvoyé est traité (rendu ou analysé). Quoi qu'il en soit, j'ai écrit une bibliothèque de commodité en Java et il vous appartient de décider de l'utiliser ou non :

https://github.com/afedulov/google-web-search

0 votes

Après des heures de recherche pour une solution écrite en Java qui fonctionne vraiment, votre solution semble être la manière la plus viable de le faire dans un environnement Java. Votre code a besoin de quelques ajustements au fait...

0 votes

N'hésitez pas à ouvrir un problème sur github

2voto

Sai Sunder Points 392

En effet, il existe une API pour rechercher Google de manière programmable. L'API s'appelle Google Custom Search. Pour utiliser cette API, vous aurez besoin d'une clé d'API de développeur Google et d'une clé cx. Une procédure simple pour accéder à la recherche google à partir d'un programme Java est expliquée dans mon blog.

Maintenant mort, voici le lien de la machine à remonter le temps.

0 votes

Dans votre blog, dans la partie sur la clé d'API, vous avez mentionné quelque chose à propos de la clé serveur, pour les programmes écrits en Java. J'écris le mien en Java, et je voulais savoir si je devais utiliser une clé serveur, et comment utiliser ma clé d'API dans mon programme. De plus, devrais-je télécharger des bibliothèques ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X