Як ви можете шукати Google Programmatic 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 за допомогою довільного API Java JSON. Один з найкращих - 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);
}

Велике спасибі - чи це не порушує ліцензійну угоду, як згадувалося у відповіді вище? Дійсно оцініть код!
Дан

11
Зауважте, що API пошуку Google застарілий з листопада 2010 року (через 2 місяці після публікації вищевказаної відповіді). Кінцевих користувачів рекомендується перейти до API користувальницького пошуку Google: developers.google.com/custom-search/v1/overview
BalusC

2
@BalusC Це не власний пошук від Google лише для пошуку на певному веб-сайті, а не по всій мережі ??
Паргат

1
Крім того, що робити, якщо у вас немає назви компанії чи бот-сторінки ??
Майк Уоррен

1
У Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Володимир Стажилов

13

Для пошуку в Google за допомогою API слід скористатись користувацьким пошуковим пошуком Google , розшифровка веб-сторінки заборонена

У Java ви можете користуватися клієнтською бібліотекою API CustomSearch для Java

Залежність Maven:

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

Приклад пошуку за допомогою клієнтської бібліотеки API 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 google.

Наразі (дата відповіді) ви отримуєте 100 дзвінків на день за день безкоштовно, а потім Google хоче поділитися своїм прибутком.


12

У Умовах надання послуги Google ми можемо прочитати:

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

Тож я думаю, що відповідь - ні. Більше про API SOAP більше не доступний


7
Однак API AJAX надається Google - і тому він повинен бути корисним, не порушуючи цих умов надання послуг.
Жан Хомінал

Це, мабуть, стосується роботів, які не проходять API.
Джеймс П.

3

Google TOS трохи розслабився у квітні 2014 року. Тепер він стверджує:

"Не зловживайте нашими Сервісами. Наприклад, не заважайте нашим Сервісам і не намагайтеся отримати доступ до них за допомогою іншого способу, ніж інтерфейс та інструкції, які ми надаємо."

Тож уривок про "автоматизовані засоби" та сценарії зараз відсутній. Очевидно, це все ще не бажаний (від google) спосіб доступу до їхніх послуг, але я думаю, що зараз формально відкрито для інтерпретації, що саме таке "інтерфейс", і чи має це значення, як саме обробляється повернутий HTML ( винесені або розібрані). Так чи інакше, я написав бібліотеку зручності Java, і ви вирішуєте, використовувати її чи ні:

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


після годинного пошуку рішення, написаного на Java, яке справді працює, ваше рішення, здається, є найбільш життєздатним способом зробити це в середовищі Java. Ваш код потребує певних коригувань, до речі ...
Digao,

сміливо відкривайте випуск на Github
Алекс Федулов

2

Дійсно, існує API для програмного пошуку google. API називається спеціальним пошуком Google. Для використання цього API вам знадобиться ключ API розробника Google та ключ cx. Проста процедура доступу до google search з програми java пояснена в моєму блозі.

Тепер мертвий, ось посилання Machine Wayback .


У своєму блозі, в частині про ключ 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 і повинен бути досить легким для реалізації з детальними документами.

Прикро, що Бінг і Yahoo в цьому плані на відстані миль від Google. Їх API не дешеві, але принаймні доступні.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.