Comment faire une recherche sur Google API Java par programmation [fermé]


105

Est-ce que quelqu'un sait si et comment il est possible de rechercher Google par programme - surtout s'il existe une API Java pour cela?


Nous avons un support pour nodejs?
Vinod Kumar Marupu

Exemple de recherche Google en utilisant Java - Analyseur HTML Jsoup
Prashanth

Réponses:


138

Quelques faits:

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

  2. Java propose java.net.URLet java.net.URLConnectionpour déclencher et gérer les requêtes HTTP.

  3. 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 + "]"; }
    }

}

Voir également:


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

Merci beaucoup - n'est-ce pas une rupture du contrat de licence comme mentionné dans la réponse ci-dessus? J'apprécie vraiment le code!
Dan

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

2
@BalusC La recherche personnalisée de Google n'est-elle pas uniquement destinée à rechercher sur un site Web particulier plutôt que sur l'ensemble du Web?
Pargat

1
Et si vous n'avez pas de nom d'entreprise ou de page de bot ??
Mike Warren

1
Dans Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Vladimir Stazhilov

13

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.


12

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


7
Cependant, l'API AJAX est fournie par Google - et devrait donc être utilisable sans enfreindre ces conditions d'utilisation.
Jean Hominal

Cela s'applique probablement aux robots qui ne passent pas par l'API.
James P.

3

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:

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


après des heures de recherche d'une solution écrite en java qui fonctionne vraiment, votre solution semble être le moyen le plus viable de le faire dans un environnement java. Votre code a besoin de quelques ajustements en passant ...
Digao

n'hésitez pas à ouvrir un numéro sur github
Alex Fedulov

2

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 .


Dans votre blog, concernant la clé API, vous avez mentionné quelque chose sur 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é de serveur et comment utiliser ma clé API dans mon programme. De plus, devrais-je télécharger des bibliothèques?
Mike Warren

0

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


-1

À 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.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.