Кто-нибудь знает, можно ли и как искать в Google программно - особенно если для этого есть Java API?
Кто-нибудь знает, можно ли и как искать в Google программно - особенно если для этого есть Java API?
Ответы:
Некоторые факты:
Google предлагает общедоступный API веб-службы поиска, который возвращает JSON : http://ajax.googleapis.com/ajax/services/search/web . Документация здесь
Java предлагает java.net.URL
и java.net.URLConnection
запускать и обрабатывать HTTP-запросы.
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 + "]"; }
}
}
java.net.URLConnection
Обновление с ноября 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);
}
Для поиска в 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 хочет поделиться вашей прибылью.
В Условиях использования Google мы можем прочитать:
5.3. Вы соглашаетесь не получать (и не пытаться получить доступ) к каким-либо Услугам никакими средствами, кроме интерфейса, предоставляемого Google, за исключением случаев, когда вам было специально разрешено это делать в отдельном соглашении с Google. Вы прямо соглашаетесь не получать (и не пытаться получить доступ) к любым Сервисам с помощью каких-либо автоматических средств (включая использование скриптов или веб-сканеров) и обязуетесь соблюдать инструкции, изложенные в любом файле robots.txt, представленном в Сервисах. .
Думаю, ответ - нет. Более того, SOAP API больше не доступен.
Условия использования Google были немного смягчены в апреле 2014 года. Теперь они гласят:
«Не злоупотребляйте нашими Сервисами. Например, не вмешивайтесь в наши Сервисы и не пытайтесь получить к ним доступ, используя другой метод, кроме интерфейса и инструкций, которые мы предоставляем».
Так что отрывка об «автоматизированных средствах» и скриптах теперь нет. Очевидно, это все еще не желаемый (со стороны Google) способ доступа к их службам, но я думаю, что теперь он формально открыт для интерпретации того, что такое «интерфейс» и имеет ли это какое-либо значение в отношении того, как именно обрабатывается возвращаемый HTML ( обработанный или проанализированный). Как бы то ни было, я написал удобную библиотеку Java, и вам решать, использовать ее или нет:
Действительно, есть API для программного поиска в Google. API называется пользовательским поиском Google. Для использования этого API вам понадобится ключ Google Developer API и ключ cx. В моем блоге объясняется простая процедура доступа к поиску Google из Java-программы.
Теперь мертв, вот ссылка на Wayback Machine .
В качестве альтернативы ответу 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
В свете этих изменений TOS в прошлом году мы создали API, который дает доступ к поиску Google. Он был предназначен только для нашего собственного использования, но после некоторых запросов мы решили открыть его. Мы планируем добавить дополнительные поисковые системы в будущем!
Если кто-то ищет простой способ реализовать / получить результаты поиска, вы можете зарегистрироваться и попробовать REST API: https://searchapi.io
Он возвращает результаты в формате JSON и должен быть достаточно простым для реализации с помощью подробной документации.
Жаль, что Bing и Yahoo намного опережают Google в этом отношении. Их API-интерфейсы недешевы, но, по крайней мере, доступны.
Просто альтернатива. Поиск в Google и анализ результатов также могут выполняться обычным способом с использованием любого парсера HTML, такого как Jsoup в Java. Ниже приводится ссылка на упомянутый пример.
https://www.codeforeach.com/java/example-how-to-search-google-using-java