Как можно искать в Google программно Java API [закрыто]

105

Кто-нибудь знает, можно ли и как искать в Google программно - особенно если для этого есть Java API?

Дэн
источник
У нас есть поддержка nodejs?
Винод Кумар Марупу
Пример поиска в Google с использованием Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Ответы:

138

Некоторые факты:

  1. Google предлагает общедоступный API веб-службы поиска, который возвращает JSON : http://ajax.googleapis.com/ajax/services/search/web . Документация здесь

  2. Java предлагает java.net.URLи java.net.URLConnectionзапускать и обрабатывать HTTP-запросы.

  3. JSON может быть преобразован в Java в полноценный объект Javabean с использованием произвольного Java JSON API. Один из лучших - Google Gson .

Теперь посчитаем:

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

С этим классом Javabean, представляющим наиболее важные данные JSON, возвращаемые Google (на самом деле он возвращает больше данных, но это оставлено на ваше усмотрение в качестве упражнения для соответствующего расширения этого кода 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 + "]"; }
    }

}

Смотрите также:


Обновление с ноября 2010 г. (через 2 месяца после указанного выше ответа) веб -сервис общедоступного поиска устарел (и последний день, когда эта услуга была предложена, было 29 сентября 2014 г.). Лучше всего сейчас запрашивать http://www.google.com/search напрямую вместе с честным пользовательским агентом, а затем анализировать результат с помощью парсера HTML . Если вы опустите пользовательский агент, вы получите ответ 403. Если вы лежите в пользовательском агенте и имитируете веб-браузер (например, Chrome или Firefox), вы получаете гораздо больший ответ HTML, что является пустой тратой полосы пропускания и производительности.

Вот начальный пример использования Jsoup в качестве парсера 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
источник
Большое спасибо - это не нарушение лицензионного соглашения, упомянутого в ответе выше? Очень цените код!
Дэн
11
Обратите внимание, что API поиска Google устарел с ноября 2010 года (через 2 месяца после публикации вышеуказанного ответа). Конечным пользователям рекомендуется перейти на API пользовательского поиска Google: developers.google.com/custom-search/v1/overview
BalusC
2
@BalusC Разве пользовательский поиск Google не предназначен только для поиска внутри определенного веб-сайта, а не для всей сети ??
Pargat
1
А что делать, если у вас нет названия компании или страницы бота?
Майк Уоррен
1
В Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Владимир Стажилов
13

Для поиска в Google с помощью API вы должны использовать Google Custom Search , очистка веб-страницы не разрешена.

В java вы можете использовать клиентскую библиотеку CustomSearch API для Java

Зависимость от maven:

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

Пример поиска кода с использованием клиентской библиотеки Google CustomSearch API

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

}

Как видите, вам нужно будет запросить ключ api и настроить собственный идентификатор поисковой системы cx .

Обратите внимание, что вы можете искать по всей сети, выбрав «Искать по всей сети» в основных настройках вкладки во время настройки cx, но результаты не будут точно такими же, как при обычном поиске в браузере Google.

В настоящее время (дата ответа) вы получаете 100 вызовов API в день бесплатно, а затем Google хочет поделиться вашей прибылью.

Петтер Фриберг
источник
12

В Условиях использования Google мы можем прочитать:

5.3. Вы соглашаетесь не получать (и не пытаться получить доступ) к каким-либо Услугам никакими средствами, кроме интерфейса, предоставляемого Google, за исключением случаев, когда вам было специально разрешено это делать в отдельном соглашении с Google. Вы прямо соглашаетесь не получать (и не пытаться получить доступ) к любым Сервисам с помощью каких-либо автоматических средств (включая использование скриптов или веб-сканеров) и обязуетесь соблюдать инструкции, изложенные в любом файле robots.txt, представленном в Сервисах. .

Думаю, ответ - нет. Более того, SOAP API больше не доступен.

Мануэль Сельва
источник
7
Однако API AJAX предоставляется Google, поэтому его следует использовать без нарушения данных условий обслуживания.
Jean Hominal
Вероятно, это относится к роботам, которые не проходят через API.
Джеймс П.
3

Условия использования Google были немного смягчены в апреле 2014 года. Теперь они гласят:

«Не злоупотребляйте нашими Сервисами. Например, не вмешивайтесь в наши Сервисы и не пытайтесь получить к ним доступ, используя другой метод, кроме интерфейса и инструкций, которые мы предоставляем».

Так что отрывка об «автоматизированных средствах» и скриптах теперь нет. Очевидно, это все еще не желаемый (со стороны Google) способ доступа к их службам, но я думаю, что теперь он формально открыт для интерпретации того, что такое «интерфейс» и имеет ли это какое-либо значение в отношении того, как именно обрабатывается возвращаемый HTML ( обработанный или проанализированный). Как бы то ни было, я написал удобную библиотеку Java, и вам решать, использовать ее или нет:

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

Алексей Федулов
источник
после нескольких часов поиска решения, написанного на Java, которое действительно работает, ваше решение кажется наиболее жизнеспособным способом сделать это в среде Java. Кстати, ваш код требует некоторых корректировок ...
Дигао,
не стесняйтесь открывать выпуск на github
Alex
2

Действительно, есть API для программного поиска в Google. API называется пользовательским поиском Google. Для использования этого API вам понадобится ключ Google Developer API и ключ cx. В моем блоге объясняется простая процедура доступа к поиску Google из Java-программы.

Теперь мертв, вот ссылка на Wayback Machine .

Сай Сандер
источник
В своем блоге, касаясь ключа API, вы упомянули кое-что о ключе сервера для программ, написанных на Java. Я пишу свой на Java и хотел знать, следует ли мне использовать ключ сервера и как я могу использовать свой ключ API в своей программе. Кроме того, нужно ли мне загружать какие-либо библиотеки?
Майк Уоррен
0

В качестве альтернативы ответу BalusC, поскольку он устарел и вам нужно использовать прокси, вы можете использовать этот пакет. Пример кода:

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

Библиотека на GitHub

Хартатор
источник
-1

В свете этих изменений TOS в прошлом году мы создали API, который дает доступ к поиску Google. Он был предназначен только для нашего собственного использования, но после некоторых запросов мы решили открыть его. Мы планируем добавить дополнительные поисковые системы в будущем!

Если кто-то ищет простой способ реализовать / получить результаты поиска, вы можете зарегистрироваться и попробовать REST API: https://searchapi.io

Он возвращает результаты в формате JSON и должен быть достаточно простым для реализации с помощью подробной документации.

Жаль, что Bing и Yahoo намного опережают Google в этом отношении. Их API-интерфейсы недешевы, но, по крайней мере, доступны.

Стэн Смолдерс
источник
-1

Просто альтернатива. Поиск в Google и анализ результатов также могут выполняться обычным способом с использованием любого парсера HTML, такого как Jsoup в Java. Ниже приводится ссылка на упомянутый пример.

https://www.codeforeach.com/java/example-how-to-search-google-using-java

Прашант
источник