Bagaimana Anda bisa mencari Google Programmatically Java API [tutup]

105

Adakah yang tahu jika dan bagaimana mungkin untuk mencari Google secara terprogram - terutama jika ada Java API untuk itu?

Dan
sumber
Kami memiliki dukungan untuk nodejs?
Vinod Kumar Marupu
Contoh untuk menelusuri google menggunakan Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Jawaban:

138

Beberapa fakta:

  1. Google menawarkan API layanan web penelusuran publik yang mengembalikan JSON : http://ajax.googleapis.com/ajax/services/search/web . Dokumentasi di sini

  2. Java menawarkan java.net.URLdan java.net.URLConnectionuntuk mengaktifkan serta menangani permintaan HTTP.

  3. JSON di Java dapat diubah menjadi objek Javabean yang layak menggunakan sembarang Java JSON API. Salah satu yang terbaik adalah Google Gson .

Sekarang lakukan perhitungannya:

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());
}

Dengan kelas Javabean ini mewakili data JSON paling penting yang dikembalikan oleh Google (sebenarnya ini mengembalikan lebih banyak data, tetapi terserah Anda sebagai latihan untuk memperluas kode Javabean ini sesuai):

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 + "]"; }
    }

}

Lihat juga:


Pembaruan sejak November 2010 (2 bulan setelah jawaban di atas), layanan web penelusuran publik sudah tidak digunakan lagi (dan hari terakhir layanan ditawarkan adalah 29 September 2014). Taruhan terbaik Anda sekarang adalah menanyakan http://www.google.com/search secara langsung bersama dengan agen pengguna yang jujur ​​dan kemudian mengurai hasilnya menggunakan pengurai HTML . Jika Anda menghilangkan agen pengguna, maka Anda mendapatkan kembali 403. Jika Anda berbohong di agen pengguna dan mensimulasikan browser web (misalnya Chrome atau Firefox), maka Anda mendapatkan respons HTML yang jauh lebih besar yang membuang-buang bandwidth dan kinerja.

Berikut adalah contoh awal menggunakan Jsoup sebagai parser 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);
}
BalusC
sumber
Terima kasih banyak - bukankah ini melanggar perjanjian lisensi seperti yang disebutkan dalam jawaban di atas? Sangat menghargai kodenya!
Dan
11
Harap perhatikan bahwa Google Search API sudah tidak digunakan lagi sejak November 2010 (2 bulan setelah jawaban di atas diposting). Pengguna akhir didorong untuk pindah ke Google Custom Search API: developers.google.com/custom-search/v1/overview
BalusC
2
@BalusC Bukankah pencarian kustom Google hanya untuk mencari di dalam situs web tertentu daripada seluruh web ??
Pargat
1
Juga, bagaimana jika Anda tidak memiliki nama perusahaan atau halaman bot ??
Mike Warren
1
Dalam Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Vladimir Stazhilov
13

Untuk mencari google menggunakan API, Anda harus menggunakan Google Custom Search , menggores halaman web tidak diperbolehkan

Di java, Anda dapat menggunakan Pustaka Klien API Penelusuran Khusus untuk Java

Ketergantungan maven adalah:

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-customsearch</artifactId>
    <version>v1-rev57-1.23.0</version>
</dependency> 

Contoh kode pencarian menggunakan Google CustomSearch API Client Library

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());
        }
    }

}

Seperti yang Anda lihat, Anda perlu meminta kunci api dan menyiapkan id mesin pencari sendiri, cx .

Perhatikan bahwa Anda dapat menelusuri seluruh web dengan memilih "Telusuri seluruh web" pada setelan tab dasar selama penyiapan cx, tetapi hasilnya tidak akan sama persis dengan penelusuran Google peramban biasa.

Saat ini (tanggal jawaban) Anda mendapatkan 100 panggilan api per hari secara gratis, lalu google ingin membagikan keuntungan Anda.

Petter Friberg
sumber
12

Dalam Terms of Service google kita bisa membaca:

5.3 Anda setuju untuk tidak mengakses (atau mencoba mengakses) Layanan apa pun dengan cara apa pun selain melalui antarmuka yang disediakan oleh Google, kecuali jika Anda diizinkan secara khusus untuk melakukannya dalam perjanjian terpisah dengan Google. Anda secara khusus setuju untuk tidak mengakses (atau mencoba mengakses) Layanan apa pun melalui sarana otomatis apa pun (termasuk penggunaan skrip atau perayap web) dan harus memastikan bahwa Anda mematuhi petunjuk yang ditetapkan dalam file robots.txt yang ada di Layanan. .

Jadi saya kira jawabannya adalah Tidak. Lebih dari SOAP API tidak lagi tersedia

Manuel Selva
sumber
7
Namun, AJAX API disediakan oleh Google - dan karenanya harus dapat digunakan tanpa melanggar persyaratan layanan ini.
Jean Hominal
Ini mungkin berlaku untuk robot yang tidak melalui API.
James P.
3

Persyaratan Layanan Google telah sedikit dilonggarkan pada bulan April 2014. Sekarang dinyatakan:

"Jangan menyalahgunakan Layanan kami. Misalnya, jangan mengganggu Layanan kami atau mencoba mengaksesnya menggunakan metode selain antarmuka dan instruksi yang kami berikan."

Jadi bagian tentang "sarana otomatis" dan skrip sudah hilang sekarang. Ini jelas masih bukan cara yang diinginkan (oleh google) untuk mengakses layanan mereka, tapi saya pikir itu sekarang secara resmi terbuka untuk interpretasi tentang apa sebenarnya "antarmuka" itu dan apakah itu membuat perbedaan tentang bagaimana tepatnya HTML yang dikembalikan diproses ( diberikan atau diurai). Bagaimanapun, saya telah menulis perpustakaan kemudahan Java dan terserah Anda untuk memutuskan apakah akan menggunakannya atau tidak:

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

Alex Fedulov
sumber
setelah berjam-jam meneliti solusi yang ditulis dalam java yang benar-benar berfungsi, solusi Anda tampaknya menjadi cara paling layak untuk melakukan ini di dalam lingkungan java. Kode Anda memerlukan beberapa penyesuaian dengan cara ...
Digao
jangan ragu untuk membuka masalah di github
Alex Fedulov
2

Memang ada API untuk mencari google secara terprogram. API tersebut disebut pencarian kustom google. Untuk menggunakan API ini, Anda memerlukan kunci API Pengembang Google dan kunci cx. Prosedur sederhana untuk mengakses pencarian google dari program java dijelaskan di blog saya.

Sekarang mati, ini link Wayback Machine .

Sai Sunder
sumber
Di blog Anda, di bagian tentang kunci API, Anda menyebutkan sesuatu tentang kunci server, untuk program yang ditulis di Java. Saya menulis milik saya di Java, dan ingin tahu apakah saya harus menggunakan kunci server, dan bagaimana saya akan menggunakan kunci API saya dalam program saya. Juga, apakah saya harus mengunduh perpustakaan apa pun?
Mike Warren
0

Sebagai alternatif jawaban BalusC karena sudah tidak digunakan lagi dan Anda harus menggunakan proxy, Anda dapat menggunakan paket ini. Contoh kode:

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());

Perpustakaan di GitHub

Hartator
sumber
-1

Mengingat perubahan KL tersebut tahun lalu, kami membangun API yang memberikan akses ke pencarian Google. Itu hanya untuk penggunaan kami sendiri tetapi setelah beberapa permintaan kami memutuskan untuk membukanya. Kami berencana menambahkan mesin telusur tambahan di masa mendatang!

Jika ada yang mencari cara mudah untuk menerapkan / memperoleh hasil pencarian, Anda bebas mendaftar dan mencoba REST API: https://searchapi.io

Ini mengembalikan hasil JSON dan seharusnya cukup mudah untuk diterapkan dengan dokumen terperinci.

Sayang sekali Bing dan Yahoo berada jauh di depan di Google dalam hal ini. API mereka tidak murah, tapi setidaknya tersedia.

Stan Smulders
sumber