Google'da Programlı Olarak Java API [kapalı] arama yapabilirsiniz


105

Google'da programlı olarak arama yapmanın mümkün olup olmadığını ve nasıl mümkün olduğunu bilen var mı - özellikle bunun için bir Java API varsa?


Nodejs için desteğimiz var mı?
Vinod Kumar Marupu

Java kullanarak google'da arama örneği - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Yanıtlar:


138

Bazı gerçekler:

  1. Google döndüren bir genel arama webservice API sunmaktadır JSON : http://ajax.googleapis.com/ajax/services/search/web . Belgeler burada

  2. Java teklifler java.net.URLve java.net.URLConnectionyangın ve sap HTTP isteklerine.

  3. JSON, Java'da keyfi bir Java JSON API kullanılarak tam değerli bir Javabean nesnesine dönüştürülebilir. En iyilerden biri Google Gson .

Şimdi hesaplayın:

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

Google tarafından döndürülen en önemli JSON verilerini temsil eden bu Javabean sınıfı ile (aslında daha fazla veri döndürür, ancak bu Javabean kodunu uygun şekilde genişletme alıştırması olarak size bırakılmıştır):

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

}

Ayrıca bakınız:


Kasım 2010'dan bu yana güncelleme (yukarıdaki yanıttan 2 ay sonra), genel arama web hizmeti kullanımdan kaldırıldı (ve hizmetin sunulduğu son gün 29 Eylül 2014 idi). Şimdi yapabileceğiniz en iyi şey, http://www.google.com/search ile dürüst bir kullanıcı aracısını doğrudan sorgulamak ve ardından sonucu bir HTML ayrıştırıcı kullanarak ayrıştırmaktır . Kullanıcı aracısını atlarsanız, bir 403 geri alırsınız. Kullanıcı aracısında yatıyorsanız ve bir web tarayıcısını simüle ediyorsanız (ör. Chrome veya Firefox), çok daha büyük bir HTML yanıtı alırsınız, bu da bant genişliği ve performans kaybıdır.

Jsoup'u HTML ayrıştırıcısı olarak kullanan bir başlangıç ​​örneği :

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

Çok teşekkürler - bu, yukarıdaki yanıtta belirtildiği gibi lisans sözleşmesini ihlal etmiyor mu? Kodu gerçekten takdir edin!
Dan

11
Lütfen Google Arama API'sinin Kasım 2010'dan beri (yukarıdaki yanıtın gönderilmesinden 2 ay sonra) kullanımdan kaldırıldığını unutmayın. Son kullanıcıların Google Özel Arama API'sına
geçmeleri önerilir

2
@BalusC Google'ın özel araması, tüm web yerine yalnızca belirli bir web sitesinde arama yapmak değil mi?
Pargat

1
Ayrıca, bir şirket adınız veya bot sayfanız yoksa?
Mike Warren

1
Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Vladimir Stazhilov

13

API kullanarak Google'da arama yapmak için Google Özel Arama kullanmanız gerekir , web sayfasının kopyalanmasına izin verilmez

Java'da, Java için CustomSearch API İstemci Kitaplığı'nı kullanabilirsiniz

Maven bağımlılığı şudur:

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

Google CustomSearch API İstemci Kitaplığı kullanarak örnek kod arama

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

}

Gördüğünüz gibi, bir api anahtarı istemeniz ve kendi arama motoru kimliği, cx'i kurmanız gerekecek .

Cx kurulumu sırasında temel sekme ayarlarında "Tüm web'de ara" yı seçerek tüm web'de arama yapabileceğinizi, ancak sonuçların normal tarayıcı google aramasıyla tam olarak aynı olmayacağını unutmayın.

Şu anda (cevap tarihi) günde ücretsiz 100 API araması alıyorsunuz, ardından google karınızı paylaşmak istiyor.


12

In google Hizmet Şartları biz okuyabilir:

5.3 Google ile ayrı bir sözleşmede özel olarak izin verilmedikçe, Google tarafından sağlanan arayüz dışında hiçbir şekilde Hizmetlere erişmemeyi (veya erişme girişiminde bulunmamayı) kabul edersiniz. Hizmetlerden herhangi birine herhangi bir otomatik yolla (komut dosyası veya web tarayıcılarının kullanımı dahil) erişmemeyi (veya erişmeye çalışmamayı) özellikle kabul edersiniz ve Hizmetlerde bulunan herhangi bir robots.txt dosyasında belirtilen talimatlara uymanızı sağlarsınız. .

Sanırım cevap hayır . SOAP API'sinin daha fazlası artık mevcut değil


7
Ancak AJAX API, Google tarafından sağlanır ve bu nedenle bu hizmet şartlarını ihlal etmeden kullanılabilir olmalıdır.
Jean Hominal

Bu muhtemelen API'den geçmeyen robotlar için geçerlidir.
James P.

3

Google Hizmet Şartları, Nisan 2014'te biraz gevşetildi. Şimdi şunu belirtiyor:

"Hizmetlerimizi kötüye kullanmayın. Örneğin, Hizmetlerimize müdahale etmeyin veya sunduğumuz arayüz ve talimatlardan başka bir yöntem kullanarak onlara erişmeye çalışmayın."

Yani "otomatikleştirilmiş araçlar" ve komut dosyaları hakkındaki pasaj artık yok. Görünüşe göre, hizmetlerine erişmek için hala istenen (google tarafından) bir yol değil, ancak artık bir "arayüzün" tam olarak ne olduğu ve tam olarak döndürülen HTML'nin nasıl işlendiğine ( oluşturulmuş veya ayrıştırılmış). Her neyse, bir Java uygunluk kitaplığı yazdım ve kullanıp kullanmayacağınıza karar vermek size kalmış:

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


Java ile yazılmış ve gerçekten işe yarayan bir çözüm için saatlerce araştırma yaptıktan sonra, çözümünüz bunu bir java ortamında yapmanın en uygun yolu gibi görünüyor. Bu arada kodunuzun bazı ayarlamalara ihtiyacı var ...
Digao


2

Google'da programlı olarak arama yapmak için bir API var. API, google özel arama olarak adlandırılır. Bu API'yi kullanmak için bir Google Developer API anahtarına ve bir cx anahtarına ihtiyacınız olacak. Google aramaya java programından erişmek için basit bir prosedür blogumda açıklanmıştır.

Şimdi öldü, işte Wayback Makinesi bağlantısı .


Blogunuzda, API anahtarı ile ilgili bölümde, Java ile yazılan programlar için sunucu anahtarından bahsetmiştiniz. Benimkini Java ile yazıyorum ve bir sunucu anahtarı kullanmam gerekip gerekmediğini ve API anahtarımı programımda nasıl kullanacağımı öğrenmek istiyordum. Ayrıca herhangi bir kitaplık indirmem gerekir mi?
Mike Warren

0

Kullanımdan kaldırıldığı ve proxy kullanmanız gerektiği için BalusC cevabına bir alternatif olarak bu paketi kullanabilirsiniz. Kod örneği:

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'daki kitaplık


-1

Geçen yılki TOS değişikliklerinin ışığında, Google'ın aramasına erişim sağlayan bir API geliştirdik. Sadece kendi kullanımımız içindi, ancak bazı taleplerden sonra açmaya karar verdik. Gelecekte ek arama motorları eklemeyi planlıyoruz!

Herhangi biri arama sonuçlarını uygulamak / elde etmek için kolay bir yol arıyorsa, kaydolmakta ve REST API'yi denemekte özgürsünüz: https://searchapi.io

JSON sonuçlarını döndürür ve ayrıntılı belgelerle uygulanması yeterince kolay olmalıdır.

Bing ve Yahoo'nun bu konuda Google'da kilometrelerce ileride olması utanç verici. API'leri ucuz değil, en azından mevcut.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.