java - for - google js api
¿Cómo se puede buscar Google Programmatically Java API (7)
A la luz de las alteraciones de TOS del año pasado, creamos una API que da acceso a la búsqueda de Google. Fue 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 está buscando una manera fácil de implementar / adquirir resultados de búsqueda, puede inscribirse y probar la API REST: https://searchapi.io
Devuelve los resultados de JSON y debería ser lo suficientemente fácil de implementar con los documentos detallados.
Es una pena que Bing y Yahoo estén muy adelante en Google en este aspecto. Sus API no son baratas, pero al menos están disponibles.
¿Alguien sabe si es posible buscar Google programáticamente y cómo hacerlo, especialmente si hay una API Java para ello?
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
yjava.net.URLConnection
parajava.net.URLConnection
y gestionar solicitudes HTTP.JSON puede convertirse en Java en un objeto Javabean completo utilizando una API Java JSON arbitraria. Uno de los mejores es Google Gson .
Ahora haz las matemáticas:
public static void main(String[] args) throws Exception {
String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
String search = "";
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 representando los datos JSON más importantes devueltos por Google (en realidad devuelve más datos, pero se le deja a usted como un ejercicio para 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:
- Cómo iniciar y gestionar solicitudes HTTP utilizando
java.net.URLConnection
- Cómo convertir JSON a Java
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 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 utilizando un analizador HTML . Si omites el agente de usuario, obtienes un 403 de vuelta. Si está mintiendo en el agente de usuario y simula un navegador web (por ejemplo, Chrome o Firefox), entonces obtendrá una forma mucho más grande de respuesta HTML que es una pérdida de ancho de banda y rendimiento.
Aquí hay un ejemplo de kickoff usando Jsoup como analizador de HTML:
String google = "http://www.google.com/search?q=";
String search = "";
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);
}
Como alternativa a la respuesta de BalusC, ya que ha quedado obsoleta 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
De hecho, hay una API para buscar en Google mediante programación. La API se llama búsqueda personalizada de google. Para usar esta API, necesitará una clave de Google Developer API y una clave cx . Un procedimiento simple para acceder a la búsqueda de google desde el programa java se explica en mi blog http://preciselyconcise.com/apis_and_installations/search_google_programmatically.php
En los Términos 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 SOAP ya no está disponible
Google TOS se ha relajado un poco en abril de 2014. Ahora dice:
"No haga mal uso de nuestros Servicios. Por ejemplo, no interfiera con nuestros Servicios o intente acceder a ellos utilizando un método que no sea la interfaz y las instrucciones que proporcionamos".
Entonces el pasaje sobre "medios automáticos" 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 abierto a la interpretación de qué es exactamente una "interfaz" y si hace alguna diferencia en cómo exactamente se procesa 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:
Para buscar en Google usando la API, debe usar la Búsqueda personalizada de Google , no se permite la eliminación de la página web.
En java puede usar CustomSearch API Client Library 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>
Búsqueda de código de ejemplo utilizando la biblioteca de cliente de la API de 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());
}
}
}
Como puede ver, deberá solicitar una clave de API y configurar su propio id de motor de búsqueda, cx .
Tenga en cuenta que puede buscar en toda la web seleccionando "Buscar en toda la web" en la configuración de pestañas básicas durante la configuración de cx, pero los resultados no serán exactamente los mismos que en una búsqueda de navegador normal en Google.
Actualmente (fecha de respuesta) recibe 100 llamadas api por día de forma gratuita, luego google desea compartir sus ganancias.