Qualcuno sa se e come è possibile cercare in Google in modo programmatico, soprattutto se esiste un'API Java?
Qualcuno sa se e come è possibile cercare in Google in modo programmatico, soprattutto se esiste un'API Java?
Risposte:
Alcuni fatti:
Google offre un'API del servizio web di ricerca pubblica che restituisce JSON : http://ajax.googleapis.com/ajax/services/search/web . Documentazione qui
Java offre java.net.URL
e java.net.URLConnection
per attivare e gestire le richieste HTTP.
JSON può essere convertito in Java in un oggetto Javabean completo utilizzando un'API JSON Java arbitraria. Uno dei migliori è Google Gson .
Ora fai i conti:
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 questa classe Javabean che rappresenta i dati JSON più importanti come restituiti da Google (in realtà restituisce più dati, ma è lasciato a te come esercizio espandere questo codice Javabean di conseguenza):
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 + "]"; }
}
}
java.net.URLConnection
Aggiornamento da novembre 2010 (2 mesi dopo la risposta precedente), il servizio web di ricerca pubblica è diventato obsoleto (e l'ultimo giorno in cui il servizio è stato offerto è stato il 29 settembre 2014). La soluzione migliore è ora interrogare http://www.google.com/search direttamente insieme a un agente utente onesto e quindi analizzare il risultato utilizzando un parser HTML . Se ometti il programma utente, ottieni un 403 indietro. Se stai mentendo nell'agente utente e simuli un browser web (ad esempio Chrome o Firefox), ottieni una risposta HTML molto più ampia che è uno spreco di larghezza di banda e prestazioni.
Ecco un esempio di kickoff utilizzando Jsoup come parser 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);
}
Per cercare su Google utilizzando l'API è necessario utilizzare Google Ricerca personalizzata , non è consentito lo scraping della pagina web
In java è possibile utilizzare la libreria client API CustomSearch per Java
La dipendenza Maven è:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-customsearch</artifactId>
<version>v1-rev57-1.23.0</version>
</dependency>
Esempio di ricerca di codice utilizzando la libreria client dell'API di 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());
}
}
}
Come puoi vedere dovrai richiedere una chiave API e impostare un ID motore di ricerca, cx .
Tieni presente che puoi cercare in tutto il Web selezionando "Cerca in tutto il Web" nelle impostazioni della scheda di base durante la configurazione di cx, ma i risultati non saranno esattamente gli stessi di una normale ricerca Google del browser.
Attualmente (data della risposta) ricevi 100 chiamate API al giorno gratuitamente, quindi a Google piace condividere il tuo profitto.
Nei Termini di servizio di Google possiamo leggere:
5.3 L'utente accetta di non accedere (o tentare di accedere) a nessuno dei Servizi con alcun mezzo diverso dall'interfaccia fornita da Google, a meno che non sia stato specificamente autorizzato a farlo in un contratto separato con Google. L'utente accetta espressamente di non accedere (o tentare di accedere) a nessuno dei Servizi tramite alcun mezzo automatizzato (incluso l'uso di script o web crawler) e deve garantire di rispettare le istruzioni riportate in qualsiasi file robots.txt presente sui Servizi .
Quindi immagino che la risposta sia No. Altro sull'API SOAP non è più disponibile
I Termini di servizio di Google sono stati leggermente allentati nell'aprile 2014. Ora si afferma:
"Non abusare dei nostri Servizi. Ad esempio, non interferire con i nostri Servizi o tentare di accedervi utilizzando un metodo diverso dall'interfaccia e dalle istruzioni che forniamo."
Quindi il passaggio sui "mezzi automatizzati" e gli script ora è sparito. Evidentemente non è ancora il modo desiderato (da Google) di accedere ai loro servizi, ma penso che ora sia formalmente aperto all'interpretazione di cosa sia esattamente un '"interfaccia" e se faccia qualche differenza su come esattamente viene elaborato l'HTML restituito ( renderizzato o analizzato). Comunque, ho scritto una comoda libreria Java e sta a te decidere se usarla o meno:
In effetti c'è un'API per cercare su Google a livello di programmazione. L'API si chiama ricerca personalizzata di Google. Per utilizzare questa API, avrai bisogno di una chiave API per sviluppatori Google e una chiave cx. Una semplice procedura per accedere alla ricerca su google dal programma java è spiegata nel mio blog.
Ora morto, ecco il link Wayback Machine .
In alternativa alla risposta BalusC poiché è stata deprecata e devi usare i proxy, puoi usare questo pacchetto. Esempio di codice:
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());
Libreria su GitHub
Alla luce di queste modifiche ai TOS l'anno scorso abbiamo creato un'API che dà accesso alla ricerca di Google. Era solo per nostro uso ma dopo alcune richieste abbiamo deciso di aprirlo. Stiamo progettando di aggiungere ulteriori motori di ricerca in futuro!
Se qualcuno sta cercando un modo semplice per implementare / acquisire risultati di ricerca, sei libero di registrarti e provare l'API REST: https://searchapi.io
Restituisce risultati JSON e dovrebbe essere abbastanza facile da implementare con i documenti dettagliati.
È un peccato che Bing e Yahoo siano molto più avanti su Google in questo senso. Le loro API non sono economiche, ma almeno disponibili.
Solo un'alternativa. La ricerca su Google e l'analisi dei risultati possono essere eseguite anche in modo generico utilizzando qualsiasi HTML Parser come Jsoup in Java. Di seguito è riportato il collegamento all'esempio citato.
https://www.codeforeach.com/java/example-how-to-search-google-using-java