Jak można wyszukiwać programowo w Google API Java [zamknięte]

105

Czy ktoś wie, czy i jak można wyszukiwać w Google programowo - zwłaszcza jeśli jest do tego Java API?

Dan
źródło
Czy mamy wsparcie dla nodejs?
Vinod Kumar Marupu
Przykład wyszukiwania w Google przy użyciu Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Odpowiedzi:

138

Kilka faktów:

  1. Google oferuje publiczną wyszukiwarkę internetową API, która zwraca JSON : http://ajax.googleapis.com/ajax/services/search/web . Dokumentacja tutaj

  2. Java oferuje java.net.URLi java.net.URLConnectionuruchamia i obsługuje żądania HTTP.

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

}

Zobacz też:


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);
}
BalusC
źródło
Wielkie dzięki - czy to nie jest zerwanie umowy licencyjnej, o której mowa w odpowiedzi powyżej? Naprawdę doceniam kod!
Dan
11
Należy pamiętać, że interfejs API wyszukiwarki Google został wycofany od listopada 2010 r. (2 miesiące po opublikowaniu powyższej odpowiedzi). Zachęcamy użytkowników końcowych do przejścia do interfejsu API wyszukiwarki niestandardowej Google: developers.google.com/custom-search/v1/overview
BalusC
2
@BalusC Czy wyszukiwarka niestandardowa Google nie służy wyłącznie do wyszukiwania w określonej witrynie internetowej, a nie w całej sieci?
Pargat
1
A co jeśli nie masz nazwy firmy ani strony bota?
Mike Warren
1
W Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Vladimir Stazhilov
13

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.

Petter Friberg
źródło
12

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

Manuel Selva
źródło
7
Jednak interfejs API AJAX jest dostarczany przez Google - dlatego powinien być użyteczny bez naruszania niniejszych warunków korzystania z usługi.
Jean Hominal,
Prawdopodobnie dotyczy to robotów, które nie przechodzą przez interfejs API.
James P.
3

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:

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

Alex Fedulov
źródło
po godzinach szukania rozwiązania napisanego w Javie, które naprawdę działa, Twoje rozwiązanie wydaje się być najbardziej realnym sposobem na zrobienie tego w środowisku Java. Twój kod wymaga pewnych poprawek ...
Digao
zapraszam
2

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 .

Sai Sunder
źródło
W swoim blogu, jeśli chodzi o klucz API, wspomniałeś o kluczu serwera dla programów napisanych w Javie. Piszę swoje w Javie i chciałem wiedzieć, czy powinienem używać klucza serwera i jak powinienem używać mojego klucza API w moim programie. Czy musiałbym też pobierać jakieś biblioteki?
Mike Warren
0

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

Hartator
źródło
-1

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.

Stan Smulders
źródło