Wie können Sie die programmgesteuerte Java-API von Google durchsuchen? [Geschlossen]


105

Weiß jemand, ob und wie es möglich ist, Google programmgesteuert zu durchsuchen - insbesondere, wenn es eine Java-API dafür gibt?


Wir haben Unterstützung für NodeJS?
Vinod Kumar Marupu

Beispiel für die Suche in Google mit Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Antworten:


137

Einige Fakten:

  1. Google bietet eine öffentliche Such-Webservice-API an, die JSON zurückgibt : http://ajax.googleapis.com/ajax/services/search/web . Dokumentation hier

  2. Java bietet java.net.URLund java.net.URLConnectionHTTP-Anfragen zu feuern und zu verarbeiten.

  3. JSON kann in Java mithilfe einer beliebigen Java-JSON-API in ein vollwertiges Javabean-Objekt konvertiert werden. Eines der besten ist Google Gson .

Jetzt rechne nach:

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

Mit dieser Javabean-Klasse, die die wichtigsten von Google zurückgegebenen JSON-Daten darstellt (es werden tatsächlich mehr Daten zurückgegeben, aber es bleibt Ihnen überlassen, diesen Javabean-Code entsprechend zu erweitern):

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

}

Siehe auch:


Update seit November 2010 (2 Monate nach der obigen Antwort), der öffentliche Such-Webservice ist veraltet (und der letzte Tag, an dem der Service angeboten wurde, war der 29. September 2014). Am besten fragen Sie jetzt http://www.google.com/search direkt zusammen mit einem ehrlichen Benutzeragenten ab und analysieren das Ergebnis mit einem HTML-Parser . Wenn Sie den Benutzeragenten weglassen, erhalten Sie eine 403 zurück. Wenn Sie im Benutzeragenten liegen und einen Webbrowser (z. B. Chrome oder Firefox) simulieren, erhalten Sie eine viel größere HTML-Antwort zurück, was eine Verschwendung von Bandbreite und Leistung darstellt.

Hier ist ein Kickoff-Beispiel mit Jsoup als HTML-Parser:

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

Vielen Dank - verstößt dies nicht gegen die Lizenzvereinbarung, wie in der obigen Antwort erwähnt? Schätzen Sie den Code wirklich!
Dan

11
Bitte beachten Sie, dass die Google-Such-API seit November 2010 (2 Monate nach Veröffentlichung der obigen Antwort) veraltet ist. Endbenutzer werden aufgefordert, zur benutzerdefinierten Such-API von Google zu wechseln: developer.google.com/custom-search/v1/overview
BalusC

2
@BalusC Ist Googles benutzerdefinierte Suche nicht nur für die Suche innerhalb einer bestimmten Website und nicht für das gesamte Web?
Pargat

1
Was ist auch, wenn Sie keinen Firmennamen oder keine Bot-Seite haben?
Mike Warren

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

13

Um Google mithilfe der API zu durchsuchen, sollten Sie die benutzerdefinierte Google-Suche verwenden . Das Scraping von Webseiten ist nicht zulässig

In Java können Sie die CustomSearch API Client Library für Java verwenden

Die Maven-Abhängigkeit ist:

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

Beispiel für die Codesuche mit der Google CustomSearch API-Clientbibliothek

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

}

Wie Sie sehen, müssen Sie einen API-Schlüssel anfordern und eine eigene Suchmaschinen-ID einrichten, cx .

Beachten Sie, dass Sie das gesamte Web durchsuchen können, indem Sie während der Einrichtung von cx in den grundlegenden Registerkarteneinstellungen "Gesamtes Web durchsuchen" auswählen. Die Ergebnisse stimmen jedoch nicht genau mit denen einer normalen Browser-Google-Suche überein.

Derzeit (Datum der Antwort) erhalten Sie 100 API-Anrufe pro Tag kostenlos, dann teilt Google gerne Ihren Gewinn.


12

In den Nutzungsbedingungen von Google können wir lesen:

5.3 Sie erklären sich damit einverstanden, auf keinen anderen Weg als über die von Google bereitgestellte Schnittstelle auf einen der Dienste zuzugreifen (oder zu versuchen, darauf zuzugreifen), es sei denn, Sie wurden ausdrücklich in einer separaten Vereinbarung mit Google dazu berechtigt. Sie erklären sich ausdrücklich damit einverstanden, nicht auf automatisierte Weise (einschließlich der Verwendung von Skripten oder Webcrawlern) auf einen der Dienste zuzugreifen (oder zu versuchen, darauf zuzugreifen), und stellen sicher, dass Sie die Anweisungen in den auf den Diensten enthaltenen robots.txt-Dateien einhalten .

Ich denke, die Antwort lautet Nein. Darüber hinaus ist die SOAP-API nicht mehr verfügbar


7
Die AJAX-API wird jedoch von Google bereitgestellt - und sollte daher ohne Verstoß gegen diese Nutzungsbedingungen verwendet werden können.
Jean Hominal

Dies gilt wahrscheinlich für Roboter, die die API nicht durchlaufen.
James P.

3

Die Google-Nutzungsbedingungen wurden im April 2014 etwas gelockert. Jetzt heißt es:

"Missbrauchen Sie unsere Dienste nicht. Beeinträchtigen Sie beispielsweise unsere Dienste nicht und versuchen Sie nicht, mit einer anderen Methode als der Schnittstelle und den von uns bereitgestellten Anweisungen auf sie zuzugreifen."

Die Passage über "automatisierte Mittel" und Skripte ist also jetzt weg. Es ist offensichtlich immer noch nicht die gewünschte (von Google) Art, auf ihre Dienste zuzugreifen, aber ich denke, es ist jetzt formal offen für die Interpretation dessen, was genau eine "Schnittstelle" ist und ob es einen Unterschied macht, wie genau zurückgegebenes HTML verarbeitet wird ( gerendert oder analysiert). Wie auch immer, ich habe eine Java-Convenience-Bibliothek geschrieben und es liegt an Ihnen, zu entscheiden, ob Sie sie verwenden oder nicht:

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


Nach stundenlangen Recherchen nach einer in Java geschriebenen Lösung, die wirklich funktioniert, scheint Ihre Lösung der praktikabelste Weg zu sein, dies in einer Java-Umgebung zu tun. Ihr Code muss übrigens einige Anpassungen vornehmen ...
Digao

Fühlen Sie sich frei, eine Ausgabe auf Github zu eröffnen
Alex Fedulov

2

In der Tat gibt es eine API, um Google programmgesteuert zu durchsuchen. Die API wird als benutzerdefinierte Google-Suche bezeichnet. Für die Verwendung dieser API benötigen Sie einen Google Developer API-Schlüssel und einen cx-Schlüssel. Ein einfaches Verfahren für den Zugriff auf die Google-Suche über das Java-Programm wird in meinem Blog erläutert.

Jetzt tot, hier ist der Link zur Wayback-Maschine .


In Ihrem Blog haben Sie in Bezug auf den API-Schlüssel etwas über den Serverschlüssel für Programme erwähnt, die in Java geschrieben sind. Ich schreibe meine in Java und wollte wissen, ob ich einen Serverschlüssel verwenden soll und wie ich meinen API-Schlüssel in meinem Programm verwenden würde. Muss ich auch Bibliotheken herunterladen?
Mike Warren

0

Als Alternative zur Antwort von BalusC können Sie dieses Paket verwenden, da es veraltet ist und Sie Proxys verwenden müssen. Codebeispiel:

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

Bibliothek auf GitHub


-1

Angesichts dieser Änderungen der Nutzungsbedingungen im letzten Jahr haben wir eine API erstellt, die den Zugriff auf die Google-Suche ermöglicht. Es war nur für unseren eigenen Gebrauch, aber nach einigen Anfragen beschlossen wir, es zu öffnen. Wir planen, in Zukunft weitere Suchmaschinen hinzuzufügen!

Wenn jemand nach einer einfachen Möglichkeit sucht, Suchergebnisse zu implementieren / zu erfassen, können Sie sich kostenlos anmelden und die REST-API ausprobieren: https://searchapi.io

Es gibt JSON-Ergebnisse zurück und sollte mit den detaillierten Dokumenten einfach zu implementieren sein.

Es ist eine Schande, dass Bing und Yahoo in dieser Hinsicht bei Google meilenweit voraus sind. Ihre APIs sind nicht billig, aber zumindest verfügbar.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.