Come puoi cercare l'API Java di Google a livello di codice [chiuso]


105

Qualcuno sa se e come è possibile cercare in Google in modo programmatico, soprattutto se esiste un'API Java?


Abbiamo il supporto per nodejs?
Vinod Kumar Marupu

Esempio per cercare su Google utilizzando Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Risposte:


138

Alcuni fatti:

  1. Google offre un'API del servizio web di ricerca pubblica che restituisce JSON : http://ajax.googleapis.com/ajax/services/search/web . Documentazione qui

  2. Java offre java.net.URLe java.net.URLConnectionper attivare e gestire le richieste HTTP.

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

}

Guarda anche:


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

Grazie mille - questo non sta violando il contratto di licenza come menzionato nella risposta sopra? Apprezzo davvero il codice!
Dan

11
Tieni presente che l'API di ricerca di Google è diventata obsoleta da novembre 2010 (2 mesi dopo la pubblicazione della risposta precedente). Gli utenti finali sono incoraggiati a passare all'API di ricerca personalizzata di Google: developers.google.com/custom-search/v1/overview
BalusC

2
@BalusC La ricerca personalizzata di Google non è solo per la ricerca all'interno di un determinato sito Web piuttosto che nell'intero Web?
Pargat

1
Inoltre, cosa succede se non si dispone di un nome di società o di una pagina bot?
Mike Warren

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

13

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.


12

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


7
Tuttavia, l'API AJAX è fornita da Google e quindi dovrebbe essere utilizzabile senza violare questi termini di servizio.
Jean Hominal,

Questo probabilmente si applica ai robot che non passano attraverso l'API.
James P.

3

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:

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


dopo ore alla ricerca di una soluzione scritta in java che funzioni davvero, la tua soluzione sembra essere il modo più praticabile per farlo all'interno di un ambiente java. Il tuo codice ha bisogno di alcuni aggiustamenti tra l'altro ...
Digao

sentiti libero di aprire un problema su GitHub
Alex Fedulov

2

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 .


Nel tuo blog, sulla parte relativa alla chiave API, hai menzionato qualcosa sulla chiave del server, per i programmi scritti in Java. Sto scrivendo il mio in Java e volevo sapere se dovrei usare una chiave del server e come avrei usato la mia chiave API nel mio programma. Inoltre, dovrei scaricare delle librerie?
Mike Warren

0

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


-1

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.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.