web-dev-qa-db-fra.com

Comment rechercher dans l'API Java Google par programme

Quelqu'un sait-il si et comment il est possible d'effectuer une recherche Google par programme, en particulier s'il existe une API Java?

97
Dan

Quelques faits: 

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

  2. Java propose Java.net.URL et Java.net.URLConnection pour déclencher et gérer les requêtes HTTP.

  3. JSON peut être converti en Java en un objet javabéen complet à l'aide d'une API JSON Java 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 javabéenne représentant les données JSON les plus importantes telles que renvoyées par Google (elle renvoie en fait davantage de données, mais il vous reste à vous exercer à développer ce code javabéen 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 + "]"; }
    }

}

Voir également:


Update 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 meilleure option consiste maintenant à interroger http://www.google.com/search directement avec un agent utilisateur honnête, puis à analyser le résultat à l'aide d'un analyseur HTML . Si vous omettez l'agent utilisateur, vous récupérez alors une 403. Si vous vous trouvez 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 représente 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);
}
131
BalusC

Dans le Conditions d'utilisation de google nous pouvons lire:

5.3 Vous acceptez de ne pas accéder (ou tenter d'accéder) aux Services par d'autres moyens que par l'interface fournie par Google, à moins que cela ne vous ait été expressément autorisé dans un contrat séparé conclu avec Google. Vous acceptez expressément de ne pas accéder (ou tenter d'accéder) aux Services par aucun moyen automatisé (y compris par l'utilisation de scripts ou de robots d'exploration de sites Web) et vous devez vous conformer aux instructions définies dans tout fichier robots.txt présent sur les Services .

Donc, je suppose que la réponse est non. Plus d'informations sur l'API SOAP n'est plus disponible

12
Manuel Selva

Pour effectuer une recherche sur Google à l'aide de l'API, vous devez utiliser Recherche personnalisée Google , le grattage d'une page Web est non autorisé

En Java, vous pouvez utiliser 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 client 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 constater, vous devrez demander une clé d'api et configurer votre propre identifiant de moteur de recherche, cx

Notez que vous pouvez effectuer une recherche sur l'ensemble du Web en sélectionnant "Rechercher sur l'ensemble du Web" dans les paramètres de base de l'onglet lors de la configuration de cx, mais les résultats ne seront pas exactement identiques à ceux d'une recherche Google classique dans le navigateur.

Actuellement (date de réponse), vous recevez gratuitement 100 appels api par jour, puis google aimez partager vos bénéfices.

7
Petter Friberg

En effet, il existe une API pour effectuer une recherche google par programme. L'API s'appelle recherche personnalisée google. Pour utiliser cette API, vous aurez besoin d'une clé de l'API Google Developer 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 http://preciselyconcise.com/apis_and_installations/search_google_programmatically.php

3
Sai Sunder

Les conditions de service de Google ont été légèrement assouplies en avril 2014. On y lit maintenant: 

"Ne pas abuser de nos services. Par exemple, n'interférez pas avec nos services et n'essayez pas d'y accéder en utilisant une méthode autre que l'interface et les instructions que nous fournissons." 

Donc, le passage sur "les moyens automatisés" et les scripts a disparu. Il est évident que ce n’est toujours pas le moyen souhaité (par Google) d’accéder à leurs services, mais je pense qu’il est maintenant ouvert à l’interprétation formelle de ce qu'est exactement une "interface" et si cela change quelque chose quant au traitement exact du HTML retourné ( 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:

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

3
Alex Fedulov

Au lieu de répondre à BalusC car il est obsolète et que vous devez utiliser des mandataires, 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

0
Hartator

À la lumière de ces modifications du TOS l'année dernière, nous avons construit une API qui donne accès à la recherche de Google. C'était pour notre propre usage seulement mais après quelques demandes nous avons décidé de l'ouvrir. Nous prévoyons d'ajouter d'autres moteurs de recherche à l'avenir!

Si quelqu'un recherche 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 les résultats JSON et devrait être assez facile à implémenter avec les documents détaillés.

Il est dommage que Bing et Yahoo soient à la pointe de la technologie sur Google à cet égard. Leurs API ne sont pas bon marché, mais au moins disponibles.

0
Stan Smulders