Czy ktoś wie, czy i jak można wyszukiwać w Google programowo - zwłaszcza jeśli jest do tego Java API?
Czy ktoś wie, czy i jak można wyszukiwać w Google programowo - zwłaszcza jeśli jest do tego Java API?
Odpowiedzi:
Kilka faktów:
Google oferuje publiczną wyszukiwarkę internetową API, która zwraca JSON : http://ajax.googleapis.com/ajax/services/search/web . Dokumentacja tutaj
Java oferuje java.net.URL
i java.net.URLConnection
uruchamia i obsługuje żądania HTTP.
JSON można w Javie przekonwertować na pełnowartościowy obiekt Javabean przy użyciu dowolnego Java JSON API. Jednym z najlepszych jest Google Gson .
Teraz policz:
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());
}
Z tą klasą Javabean reprezentującą najważniejsze dane JSON zwrócone przez Google (w rzeczywistości zwraca ona więcej danych, ale ćwiczenie, aby odpowiednio rozwinąć ten kod Javabean):
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
Aktualizacja od listopada 2010 (2 miesiące po powyższej odpowiedzi), usługa sieciowa wyszukiwania publicznego stała się przestarzała (a ostatnim dniem, w którym była oferowana, był 29 września 2014). Najlepszym rozwiązaniem jest teraz wysłanie zapytania http://www.google.com/search bezpośrednio wraz z uczciwym klientem użytkownika, a następnie przeanalizowanie wyniku za pomocą parsera HTML . Jeśli pominiesz agenta użytkownika, otrzymasz zwrot 403. Jeśli leżysz w programie użytkownika i symulujesz przeglądarkę internetową (np. Chrome lub Firefox), otrzymujesz znacznie większą odpowiedź HTML, co jest stratą przepustowości i wydajności.
Oto pierwszy przykład użycia Jsoup jako parsera 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);
}
Aby przeszukać google za pomocą interfejsu API, należy użyć Google Custom Search , kopiowanie strony internetowej jest niedozwolone
W java możesz użyć biblioteki klienta API CustomSearch dla języka Java
Zależność mavena to:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-customsearch</artifactId>
<version>v1-rev57-1.23.0</version>
</dependency>
Przykładowe wyszukiwanie kodu przy użyciu biblioteki klienta interfejsu API 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());
}
}
}
Jak widać, będziesz musiał zażądać klucza API i ustawić własny identyfikator wyszukiwarki, cx .
Pamiętaj, że możesz przeszukiwać całą sieć, wybierając opcję „Przeszukaj całą sieć” w podstawowych ustawieniach karty podczas konfiguracji cx, ale wyniki nie będą dokładnie takie same, jak w przypadku zwykłej wyszukiwarki Google w przeglądarce.
Obecnie (data odpowiedzi) otrzymujesz 100 połączeń API dziennie za darmo, a następnie Google lubisz dzielić się swoim zyskiem.
W Warunkach korzystania z usług Google możemy przeczytać:
5.3 Użytkownik zgadza się nie uzyskiwać dostępu (ani nie podejmować prób uzyskania dostępu) do jakichkolwiek Usług w żaden inny sposób niż za pośrednictwem interfejsu udostępnionego przez Google, chyba że otrzymał na to wyraźne zezwolenie w oddzielnej umowie z Google. Użytkownik wyraźnie zgadza się nie uzyskiwać dostępu (ani nie podejmować prób uzyskania dostępu) do żadnej z Usług w jakikolwiek zautomatyzowany sposób (w tym za pomocą skryptów lub robotów indeksujących) i zobowiązuje się przestrzegać instrukcji zawartych w dowolnym pliku robots.txt znajdującym się w Usługach. .
Więc myślę, że odpowiedź brzmi: Nie. Więcej informacji o SOAP API nie jest już dostępne
Warunki korzystania z usług Google zostały nieco złagodzone w kwietniu 2014 r. Obecnie stwierdza się:
„Nie nadużywaj naszych Usług. Na przykład nie ingeruj w nasze Usługi ani nie próbuj uzyskać do nich dostępu za pomocą metody innej niż interfejs i instrukcje, które udostępniamy”.
Tak więc fragment o „automatycznych środkach” i skryptach zniknął. Najwyraźniej nadal nie jest to pożądany (przez google) sposób uzyskiwania dostępu do ich usług, ale myślę, że jest teraz formalnie otwarty na interpretację tego, czym dokładnie jest „interfejs” i czy ma jakiekolwiek znaczenie, jak dokładnie przetwarzany jest zwracany kod HTML ( renderowane lub analizowane). Tak czy inaczej, napisałem wygodną bibliotekę Javy i od Ciebie zależy, czy z niej skorzystasz, czy nie:
Rzeczywiście istnieje interfejs API do programowego przeszukiwania google. Interfejs API nazywa się wyszukiwaniem niestandardowym Google. Aby korzystać z tego interfejsu API, będziesz potrzebować klucza Google Developer API i klucza cx. Prosta procedura uzyskiwania dostępu do wyszukiwarki Google z programu java jest wyjaśniona na moim blogu.
Teraz martwy, tutaj jest łącze Wayback Machine .
Jako alternatywę dla odpowiedzi BalusC, która została wycofana i musisz używać serwerów proxy, możesz użyć tego pakietu. Przykład kodu:
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());
Biblioteka na GitHubie
W świetle tych zmian TOS w zeszłym roku stworzyliśmy API, które daje dostęp do wyszukiwarki Google. To było tylko na własny użytek, ale po kilku prośbach zdecydowaliśmy się go otworzyć. W przyszłości planujemy dodać kolejne wyszukiwarki!
Jeśli ktoś szuka łatwego sposobu na wdrożenie / uzyskanie wyników wyszukiwania, możesz zarejestrować się i wypróbować REST API: https://searchapi.io
Zwraca wyniki JSON i powinien być łatwy do zaimplementowania ze szczegółową dokumentacją.
Szkoda, że Bing i Yahoo są o wiele mil przed Google pod tym względem. Ich interfejsy API nie są tanie, ale przynajmniej dostępne.
Tylko alternatywa. Przeszukiwanie Google i analizowanie wyników można również przeprowadzić w ogólny sposób przy użyciu dowolnego analizatora HTML, takiego jak Jsoup w Javie. Poniżej znajduje się link do wspomnianego przykładu.
https://www.codeforeach.com/java/example-how-to-search-google-using-java