Google Programmatically Java APIを検索するにはどうすればよいですか[終了]


105

プログラムでGoogleを検索することが可能かどうか、またどのように可能かを知っている人はいますか?特にJava APIがある場合はどうでしょうか?


nodejsをサポートしていますか?
Vinod Kumar Marupu 2017年

Javaを使用してgoogleを検索する例-Jsoup HTMLパーサー:codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

回答:


138

いくつかの事実:

  1. Googleは、JSONを返すパブリック検索WebサービスAPIを提供しています:http : //ajax.googleapis.com/ajax/services/search/webドキュメントはこちら

  2. Javaはjava.net.URLjava.net.URLConnectionHTTPリクエストを起動して処理します。

  3. JavaのJSONは、任意の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);
}

どうもありがとう-これは上記の回答で述べたようにライセンス契約に違反していませんか?コードを本当に感謝します!
Dan

11
Google Search APIは2010年11月(上記の回答が投稿されてから2か月後)に廃止されました。エンドユーザーは、Googleカスタム検索APIに移行することをお勧めします:developers.google.com/custom-search/v1/overview
BalusC

2
@BalusC Googleのカスタム検索は、Web全体ではなく、特定のWebサイト内を検索するためだけのものではありませんか?
Pargat

1
また、会社名やボットページがない場合はどうなりますか?
マイクウォーレン

1
Scala valではsearchResults = Jsoup.connect(googleBase + URLEncoder.encode(searchQuery、charset)).userAgent(userAgent).get().select( "。g> .r> a");
ウラジミールスタジロフ2016年

13

APIを使用してGoogleを検索するにはGoogleカスタム検索を使用する必要があります。ウェブページのスクレイピングは許可されていません

Javaでは、Java用のCustomSearch APIクライアントライブラリを使用できます。

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キーリクエストし、独自の検索エンジンID cx設定する必要があります

cxのセットアップ中に基本的なタブ設定で[Web全体を検索]を選択すると、Web全体を検索できますが、結果は通常のブラウザーのGoogle検索とまったく同じではないことに注意してください。

現在(回答の日付)、1日あたり100回のAPI呼び出しが無料で受けられ、グーグルは利益を共有したいと思っています。


12

Googleのサービスの利用規約我々は読むことができます:

5.3ユーザーは、Googleとの別の契約で具体的に許可されている場合を除き、Googleが提供するインターフェース以外の方法でサービスにアクセスしない(またはアクセスを試みない)ことに同意します。ユーザーは、自動化された手段(スクリプトまたはWebクローラーの使用を含む)を介してサービスにアクセスしない(またはアクセスを試行しない)ことに特に同意し、サービスに存在するrobots.txtファイルに記載されている指示に確実に準拠するものとします。 。

だから答えはノーだと思います。SOAPAPI以上のものはもう利用できません


7
ただし、AJAX APIはGoogleによって提供されているため、これらの利用規約に違反することなく使用できます。
Jean Hominal

これはおそらく、APIを経由しないロボットに適用されます。
James P.

3

Google TOSは2014年4月に少し緩和されました。現在では次のように記載されています。

「私たちのサービスを誤用しないでください。たとえば、私たちのサービスを妨害したり、提供するインターフェイスや指示以外の方法を使用してサービスにアクセスしたりしないでください。」

そのため、「自動化された手段」とスクリプトについての文章は、もうなくなっています。それは明らかにそれらのサービスにアクセスする(Googleによる)望ましい方法ではないことは明らかですが、正確に「インターフェース」とは何か、そして返されたHTMLがどのように処理されるかに関して何らかの違いがあるかどうかを正式に解釈できるようになったと思います(レンダリングまたは解析)。とにかく、私はJavaコンビニエンスライブラリを作成しました。それを使用するかどうかはあなた次第です。

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


本当に機能するJavaで書かれたソリューションを何時間も調査した後、あなたのソリューションはJava環境内でこれを行うための最も実行可能な方法のようです。ちなみに、コードにはいくつかの調整が必要です...
Digao

githubで問題をオープンしてください
Alex Fedulov

2

実際、Googleをプログラムで検索するAPIがあります。APIはgoogleカスタム検索と呼ばれます。このAPIを使用するには、Google Developer APIキーとcxキーが必要です。JavaプログラムからGoogle検索にアクセスするための簡単な手順は、私のブログで説明されています。

これで死にました。WaybackMachineリンクはこちらです。


あなたのブログでは、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の変更に照らして、Googleの検索にアクセスできるAPIを作成しました。それは私たち自身の使用のみでしたが、いくつかの要求の後、私たちはそれを開くことにしました。今後、さらに検索エンジンを追加する予定です!

検索結果を実装/取得する簡単な方法を誰かが探している場合は、自由にサインアップしてREST APIを試してください。 https //searchapi.io

JSONの結果を返し、詳細なドキュメントを実装するのに十分簡単なはずです。

この点で、BingとYahooがGoogleで何マイルも先を行っているのは残念です。それらのAPIは安価ではありませんが、少なくとも利用可能です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.