Некоторые факты:
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 + "]"; }
}
}
Смотри также:
Обновление с ноября 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);
}