16.12.2014

Окей Google. Используем Custom Search API в Java.

Google Custom Search - это система пользовательского поиска, которая позволяет создавать вам собственную "поисковую машину". Одно из распространенных применений Google Custom Search, это поиск по вашему сайту. Если вы владелец сайта и вы решили сделать поиск по нему с помощью Google, вы можете создать свою систему пользовательского поиска, указать Google, что искать нужно только на вашем сайте, а кроме того - доступны другие настройки. Однако это вовсе не единственное назначение и возможное применение Google Custom Search. Поиск может производиться не только на вашем сайте - это может быть заданный по определенным правилам список сайтов, или же вообще весь веб. Использовать Custom Search можно по разному - существует несколько вариантов API. В этой статье я покажу, как использовать Google Custom Search из Java приложения, используя REST API. Целью этого примера будет: создать Java приложение, которое может выполнить поиск в Google с помощью Custom Search API и получить список ссылок из результатов поиска. 

1. Создаем свою систему пользовательского поиска. 

Первым делом нужно создать вашу систему поиска. Для этого перейдите к управлению системами пользовательского поиска - https://www.google.com/cse. Итак, создаем новую систему поиска, кликнув "Add":

При создании системы нужно указать адрес или адреса, по которым будет выполняться поиск. Цель нашего проекта - поиск во всем вебе, так что указываем любой URL, затем переходим к свойствам только что созданной системы и в настройках указываем, что нам необходим поиск во всем Интернете:

В свойствах созданной системы нужно найти ID. Этот ID понадобится позже, для использования системы через API:

Первый шаг завершен, переходим к настройке API.

2. Настройка API. 

Для начала необходимо создать проект. Для этого переходим на https://console.developers.google.com. Создаем новый проект, после чего переходим на страницу свойств проекта. Находим раздел APIs и включаем Custom Search API:

 

Осталось получить ключ для доступа к API. Поскольку мы используем Custom Search из Java приложения, нам необходим серверный ключ, который идентифицируется по IP адресу вашего сервера. Для этого, переходим в раздел Credentials и создаем новый ключ, выбирая Public API Access и Server key соответственно:

Указываем свой IP и получаем уникальный ключ для использования API:

3. Java приложение. 

Для использования REST API необходимо сформировать URL для GET запроса, а затем разобрать ответ, который в данном случае приходит в виде JSON. В ответе содержится много информации о результате поиска, но для этого примера, мы будем использовать только ссылки из результатов поиска. Выполнив один GET запрос мы получим первую страницу результатов поиска Google. Если необходимо больше результатов, нужно выполнять несколько запросов, каждый раз указывая номер страницы из результатов поиска, которая необходима. Приведенный ниже класс содержит один открытый метод:

public static List<URL> doGoogleSearch(final String query, int page)

где query - строка поискового запроса, а page - номер страницы из результатов поиска. Начинать нужно со страницы 1. Кроме того, в указанном примере необходимо указать ключ API и ID системы поиска, которые были созданы (поля API_KEY и SEARCH_ENGINE соответственно). Полный код примера вы можете найти в конце поста.

package org.develnotes.org.customsearch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;


public class CustomSearch {

	// ключ API
	public final static String API_KEY = "YOUR_API_KEY";
	// ID поисковой системы
	public final static String SEARCH_ENGINE = "YOUR_SEARCH_ENGINE_ID";

	private final static String ENCODING = "UTF-8";
	// полный URL для поискового запроса
	private final static String GET_URL = "https://www.googleapis.com/customsearch/v1?key="
			+ API_KEY + "&cx=" + SEARCH_ENGINE + "&q=";


	public static List<URL> doGoogleSearch(final String query, int page) {

		if (query == null || query.trim().isEmpty() || page < 1) {
			throw new IllegalArgumentException(
					"Ошибка: заданы некорректные аргументы.");
		}

		List<URL> result = new ArrayList<URL>();

		// заменяем все пробелы в поисковом запросе, если есть
		String searchQuery = query.replaceAll(" ", "+");

		System.out.println("Поиск начался.");

		try {
			// номер страцы результатов поиска Google
			String start = "&start=" + String.valueOf(page);
			// небходимо закодировать UTF-8 строку
			searchQuery = URLEncoder.encode(searchQuery, ENCODING);

			URL url = new URL(GET_URL + searchQuery + start + "&alt=json&");
			// выполняем GET запрос и получаем список ссылок
			// из результатов поиска
			result.addAll(getListOfUrlsFormGoogleResponse(url));

			System.out.println("Поиск завершен");
			
		} catch (Exception e) {
			System.err.println("Во время поиска произошла ошибка: "
					+ e.getMessage());
		}

		return result;
	}

	
	private static List<URL> getListOfUrlsFormGoogleResponse(final URL url)
			throws ProtocolException, IOException {

		List<URL> result = new ArrayList<URL>();

		// создаем соединение
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();

		// заголовоки GET запроса
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Accept", "application/json");

		BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
		
		System.out.println("Строка поискового запроса: " + url.toString());
		System.out.println("Ответ от сервера: ");

		// ответ от сервера
		// в ответе содержится различная информация, однако нам необходимо
		// получить
		// только URL

		String output;

		while ((output = br.readLine()) != null) {

			System.out.println(output);
			
			final String PARAM = "\"link\": \"";
			
			// берем из ответа только ссылку и добавляем ее в результат
			if (output.contains(PARAM)) {
				String link = output.substring(
						output.indexOf(PARAM) + (PARAM).length(),
						output.indexOf("\","));
				
				result.add(new URL(link));
			}
		}

		//закрываем сетевое соединение
		conn.disconnect();

		return result;
	}
}

Итак, указав нужные ключ API и ID системы, выполним поиск:

public class Main {
	
	private static final String QUERY = "Привет Google";
	private static final int PAGE = 1;
	
	public static void main(String args[]){
		
		//выполняем поиск в Google с запросом первой страницы результатов поиска
		List<URL> result = CustomSearch.doGoogleSearch(QUERY, PAGE);
		
		System.out.println("Список ссылок из результатов поиска:");

		for (URL buff : result) {
			System.out.println(buff.toString());
		}
		
	}

}

В результате выполнения метода мы получим список ссылок из результатов поиска с первой страницы:

Поиск завершен
Список ссылок из результатов поиска:
https://developers.google.com/cloud-print/docs/privet
http://www.youtube.com/watch?v=VeG2nWNqzmc
https://play.google.com/store/apps/details?id=com.sd.google.helloKittyCafe&hl=en
http://www.youtube.com/user/helloGoogle
https://cloud.google.com/appengine/docs/python/gettingstartedpython27/helloworld
https://www.google.com/intl/en/help/maps/helloworld/
https://groups.google.com/d/topic/gcp-developers/QjAhVtfa8ic
https://www.google.com/maps/d/edit?mid=z0zV3NHl-ZFI.k4u7QEKjN0qs&ie=UTF8&t=m&oe=UTF8&msa=0
https://gigaom.com/2014/09/02/goodbye-google-enterprise-hello-google-for-work/
http://www.hellogoogle.com/

Скачать пример

GIT 



Теги: api google java

comments powered by Disqus