Weiß jemand, ob und wie es möglich ist, Google programmgesteuert zu durchsuchen - insbesondere, wenn es eine Java-API dafür gibt?
Weiß jemand, ob und wie es möglich ist, Google programmgesteuert zu durchsuchen - insbesondere, wenn es eine Java-API dafür gibt?
Antworten:
Einige Fakten:
Google bietet eine öffentliche Such-Webservice-API an, die JSON zurückgibt : http://ajax.googleapis.com/ajax/services/search/web . Dokumentation hier
Java bietet java.net.URL
und java.net.URLConnection
HTTP-Anfragen zu feuern und zu verarbeiten.
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 + "]"; }
}
}
java.net.URLConnection
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);
}
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.
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
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:
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 .
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
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.
Nur eine Alternative. Das Durchsuchen von Google und das Parsen der Ergebnisse kann auch generisch mit einem beliebigen HTML-Parser wie Jsoup in Java erfolgen. Es folgt der Link zum genannten Beispiel.
https://www.codeforeach.com/java/example-how-to-search-google-using-java