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?
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?
Yanıtlar:
Bazı gerçekler:
Google döndüren bir genel arama webservice API sunmaktadır JSON : http://ajax.googleapis.com/ajax/services/search/web . Belgeler burada
Java teklifler java.net.URL
ve java.net.URLConnection
yangın ve sap HTTP isteklerine.
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 + "]"; }
}
}
java.net.URLConnection
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);
}
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.
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
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ış:
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ı .
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
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.
Sadece bir alternatif. Google'da arama ve sonuçların ayrıştırılması, Java'daki Jsoup gibi herhangi bir HTML Ayrıştırıcı kullanılarak genel bir yolla da yapılabilir. Söz konusu örneğe bağlantı aşağıdadır.
https://www.codeforeach.com/java/example-how-to-search-google-using-java