¿Alguien sabe si es posible buscar en Google mediante programación y cómo, especialmente si hay una API de Java para ello?
¿Alguien sabe si es posible buscar en Google mediante programación y cómo, especialmente si hay una API de Java para ello?
Respuestas:
Algunos hechos:
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í
Java ofrece java.net.URL
y java.net.URLConnection
para disparar y manejar solicitudes HTTP.
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 + "]"; }
}
}
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);
}
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.
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
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:
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 .
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
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.
Solo una alternativa. La búsqueda en Google y el análisis de los resultados también se pueden hacer de forma genérica utilizando cualquier analizador HTML como Jsoup en Java. A continuación se muestra el enlace al ejemplo mencionado.
https://www.codeforeach.com/java/example-how-to-search-google-using-java