¿Cómo se pueden realizar búsquedas en la API de Java mediante programación en Google? [Cerrado]

105

¿Alguien sabe si es posible buscar en Google mediante programación y cómo, especialmente si hay una API de Java para ello?

Dan
fuente
¿Tenemos soporte para nodejs?
Vinod Kumar Marupu
Ejemplo para buscar en Google usando Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Respuestas:

138

Algunos hechos:

  1. Google ofrece una API de servicio web de búsqueda pública que devuelve JSON : http://ajax.googleapis.com/ajax/services/search/web . Documentación aquí

  2. Java ofrece java.net.URLy java.net.URLConnectionpara disparar y manejar solicitudes HTTP.

  3. JSON se puede convertir en Java en un objeto Javabean de pleno valor utilizando una API JSON de Java arbitraria. Uno de los mejores es Google Gson .

Ahora haz los cálculos:

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

Con esta clase Javabean que representa los datos JSON más importantes que devuelve Google (en realidad, devuelve más datos, pero depende de usted como ejercicio expandir este código Javabean en consecuencia):

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

}

Ver también:


Actualización desde noviembre de 2010 (2 meses después de la respuesta anterior), el servicio web de búsqueda pública ha quedado obsoleto (y el último día en el que se ofreció el servicio fue el 29 de septiembre de 2014). Su mejor opción ahora es consultar http://www.google.com/search. directamente junto con un agente de usuario honesto y luego analizar el resultado con un analizador HTML . Si omite el agente de usuario, obtendrá un 403. Si está mintiendo en el agente de usuario y simula un navegador web (por ejemplo, Chrome o Firefox), obtendrá una respuesta HTML mucho mayor, lo que es una pérdida de ancho de banda y rendimiento.

Aquí hay un ejemplo inicial usando Jsoup como analizador 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);
}
BalusC
fuente
Muchas gracias, ¿no se está rompiendo el acuerdo de licencia como se menciona en la respuesta anterior? ¡Realmente aprecio el código!
Dan
11
Tenga en cuenta que la API de búsqueda de Google ha quedado obsoleta desde noviembre de 2010 (2 meses después de que se publicó la respuesta anterior). Se anima a los usuarios finales a pasar a la API de búsqueda personalizada de Google: developers.google.com/custom-search/v1/overview
BalusC
2
@BalusC ¿No es la búsqueda personalizada de Google solo para buscar dentro de un sitio web en particular en lugar de en toda la web?
Pargat
1
Además, ¿qué pasa si no tienes un nombre de empresa o una página de bot?
Mike Warren
1
En Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Vladimir Stazhilov
13

Para buscar en Google usando la API, debe usar la Búsqueda personalizada de Google , no se permite raspar la página web

En java, puede utilizar la biblioteca cliente de la API CustomSearch para Java

La dependencia de maven es:

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-customsearch</artifactId>
    <version>v1-rev57-1.23.0</version>
</dependency> 

Ejemplo de búsqueda de código con la biblioteca cliente de la API de búsqueda personalizada de Google

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

}

Como puede ver, deberá solicitar una clave de API y configurar una identificación de motor de búsqueda propia, cx .

Tenga en cuenta que puede buscar en toda la web seleccionando "Buscar en toda la web" en la configuración básica de la pestaña durante la configuración de cx, pero los resultados no serán exactamente los mismos que los de una búsqueda de Google en un navegador normal.

Actualmente (fecha de respuesta) recibe 100 llamadas api por día de forma gratuita, luego a Google le gusta compartir sus ganancias.

Petter Friberg
fuente
12

En las Condiciones de servicio de google podemos leer:

5.3 Usted acepta no acceder (o intentar acceder) a ninguno de los Servicios por ningún medio que no sea a través de la interfaz proporcionada por Google, a menos que se le haya permitido específicamente hacerlo en un acuerdo separado con Google. Usted acepta específicamente no acceder (o intentar acceder) a ninguno de los Servicios a través de ningún medio automatizado (incluido el uso de scripts o rastreadores web) y debe asegurarse de cumplir con las instrucciones establecidas en cualquier archivo robots.txt presente en los Servicios. .

Así que supongo que la respuesta es No. Más sobre la API de SOAP ya no está disponible

Manuel Selva
fuente
7
Sin embargo, Google proporciona la API AJAX y, por lo tanto, debería poder utilizarse sin violar estos términos de servicio.
Jean Hominal
Esto probablemente se aplica a los robots que no pasan por la API.
James P.
3

Google TOS se relajó un poco en abril de 2014. Ahora dice:

"No haga un mal uso de nuestros Servicios. Por ejemplo, no interfiera con nuestros Servicios ni intente acceder a ellos utilizando un método que no sea la interfaz y las instrucciones que proporcionamos".

Así que el pasaje sobre "medios automatizados" y scripts ya no está. Evidentemente, todavía no es la forma deseada (por Google) de acceder a sus servicios, pero creo que ahora está formalmente abierta a la interpretación de qué es exactamente una "interfaz" y si hace alguna diferencia en cuanto a cómo se procesa exactamente el HTML devuelto ( renderizado o analizado). De todos modos, he escrito una biblioteca de conveniencia de Java y depende de usted decidir si usarla o no:

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

Alex Fedulov
fuente
después de horas de búsqueda de una solución escrita en Java que realmente funcione, su solución parece ser la forma más viable de hacerlo dentro de un entorno Java. Su código necesita algunos ajustes por cierto ...
Digao
no dude en abrir un problema en github
Alex Fedulov
2

De hecho, existe una API para buscar en Google mediante programación. La API se denomina búsqueda personalizada de Google. Para utilizar esta API, necesitará una clave de API de desarrollador de Google y una clave cx. En mi blog se explica un procedimiento sencillo para acceder a la búsqueda de Google desde el programa Java.

Ahora muerto, aquí está el enlace de Wayback Machine .

Sai Sunder
fuente
En tu blog, en la parte sobre la clave API, mencionaste algo sobre la clave del servidor, para programas que están escritos en Java. Estoy escribiendo el mío en Java y quería saber si debería usar una clave de servidor y cómo usaría mi clave API en mi programa. Además, ¿tendría que descargar alguna biblioteca?
Mike Warren
0

Como alternativa a la respuesta de BalusC, ya que ha quedado en desuso y debe usar proxies, puede usar este paquete. Muestra de código:

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

Biblioteca en GitHub

Hartator
fuente
-1

A la luz de esas alteraciones de TOS el año pasado, creamos una API que da acceso a la búsqueda de Google. Era solo para nuestro propio uso, pero después de algunas solicitudes decidimos abrirlo. ¡Estamos planeando agregar motores de búsqueda adicionales en el futuro!

Si alguien busca una manera fácil de implementar / adquirir resultados de búsqueda, puede registrarse y probar la API REST: https://searchapi.io

Devuelve resultados JSON y debería ser bastante fácil de implementar con los documentos detallados.

Es una pena que Bing y Yahoo estén muy por delante de Google en este sentido. Sus API no son baratas, pero al menos están disponibles.

Stan Smulders
fuente