プログラムでGoogleを検索できるかどうか、またその方法を知っている人はいますか?特にそのためのJava APIがある場合は?
7 に答える
いくつかの事実:
Google は、 JSONを返す公開検索 Web サービス API を提供しています: http://ajax.googleapis.com/ajax/services/search/web。ドキュメントはこちら
Java は
java.net.URL
、java.net.URLConnection
HTTP 要求を起動して処理することを提供します。JSON は Java で、任意の Java JSON API を使用して完全に価値のある Javabean オブジェクトに変換できます。最高のものの 1 つは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 クラスは、Google から返された最も重要な JSON データを表しています (実際にはより多くのデータが返されますが、この 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 年 11 月 (上記の回答から 2 か月後) 以降の更新により、公開検索 Webサービスは非推奨になりました (サービスが提供された最後の日は 2014 年 9 月 29 日でした)。最善の策は、 http://www.google.com/searchに正直なユーザー エージェントを使用して直接クエリを実行し、HTML パーサーを使用して結果を解析することです。ユーザー エージェントを省略すると、403 が返されます。ユーザー エージェントを使用して Web ブラウザー (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の利用規約には次のように書かれています。
5.3 ユーザーは、Google との別の契約で特に許可されている場合を除き、Google が提供するインターフェース以外の方法で本サービスにアクセスしない (またはアクセスを試みない) ことに同意するものとします。お客様は、自動化された手段 (スクリプトまたは Web クローラーの使用を含む) を通じて本サービスにアクセスしない (またはアクセスを試みない) ことに明確に同意し、本サービスに存在する robots.txt ファイルに記載されている指示に従うことを保証するものとします。 .
したがって、答えはノーだと思います。SOAP APIを超えるものは利用できなくなりました。
Google TOS は 2014 年 4 月に少し緩和されました。現在は次のように記載されています。
「当社のサービスを悪用しないでください。たとえば、当社のサービスを妨害したり、当社が提供するインターフェースや指示以外の方法を使用してサービスにアクセスしようとしたりしないでください。」
したがって、「自動化された手段」とスクリプトに関する一節はなくなりました。それは明らかに彼らのサービスにアクセスするための(Googleによる)望ましい方法ではありませんが、正確に「インターフェース」とは何か、返されたHTMLが正確にどのように処理されるかという点で違いがあるかどうかについて、正式に解釈できるようになったと思います(レンダリングまたは解析されます)。とにかく、私はJavaの便利なライブラリを書いたので、それを使うかどうかはあなた次第です:
昨年の TOS の変更を考慮して、Google の検索にアクセスできる API を作成しました。それは私たち自身の使用のみでしたが、いくつかのリクエストの後、開くことにしました。今後、さらに検索エンジンを追加する予定です。
検索結果を実装/取得する簡単な方法を探している人は、無料でサインアップして REST API を試してみてください: https://searchapi.io
これは JSON の結果を返し、詳細なドキュメントを使用して簡単に実装できるはずです。
この点で、Bing と Yahoo が Google よりはるかに先を行っているのは残念です。API は安価ではありませんが、少なくとも利用可能です。