2013-08-13 17 views
5

Java kodunu kullanarak belirli Google arama motoru sorguları için (tüm web’de) tahmini sonuç sayısını elde etmek istiyorum. İlk Google Web Search API de, kullanımdan kaldırılan olsa yeterince iyi görünüyordu böyleceProgramatik olarak Google arama sonucu sayısını elde etmenin en kolay (yasal) yolu nedir?

Ben, günde sadece çok az sorguları yapmak gerekir (ör How can you search Google Programmatically Java API bakınız). Ancak ortaya çıktığı gibi, bu API tarafından döndürülen numaralar www.google.com tarafından döndürülenlerden çok farklıdır (bkz. Ör. http://code.google.com/p/google-ajax-apis/issues/detail?id=32). Yani bu sayılar benim için oldukça işe yaramıyor. Aynı sorunu gösteren Google Custom Search engine da denedim.

Görevim için en basit çözümün sizce nedir?

cevap

4
/**** @author RAJESH Kharche */ 
//open Netbeans 
//Choose Java->prject 
//name it GoogleSearchAPP 

package googlesearchapp; 

import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class GoogleSearchAPP { 
    public static void main(String[] args) { 
     try { 
      // TODO code application logic here 

      final int Result; 

      Scanner s1=new Scanner(System.in); 
      String Str; 
      System.out.println("Enter Query to search: ");//get the query to search 
      Str=s1.next(); 
      Result=getResultsCount(Str); 

      System.out.println("Results:"+ Result); 
     } catch (IOException ex) { 
      Logger.getLogger(GoogleSearchAPP.class.getName()).log(Level.SEVERE, null, ex); 
     }  
    } 

    private static int getResultsCount(final String query) throws IOException { 
     final URL url; 
     url = new URL("https://www.google.com/search?q=" + URLEncoder.encode(query, "UTF-8")); 
     final URLConnection connection = url.openConnection(); 

     connection.setConnectTimeout(60000); 
     connection.setReadTimeout(60000); 
     connection.addRequestProperty("User-Agent", "Google Chrome/36");//put the browser name/version 

     final Scanner reader = new Scanner(connection.getInputStream(), "UTF-8"); //scanning a buffer from object returned by http request 

     while(reader.hasNextLine()){ //for each line in buffer 
      final String line = reader.nextLine(); 

      if(!line.contains("\"resultStats\">"))//line by line scanning for "resultstats" field because we want to extract number after it 
       continue; 

      try{   
       return Integer.parseInt(line.split("\"resultStats\">")[1].split("<")[0].replaceAll("[^\\d]", ""));//finally extract the number convert from string to integer 
      }finally{ 
       reader.close(); 
      } 
     } 
     reader.close(); 
     return 0; 
    } 
} 
+1

Lütfen çözümünüze bir açıklama da ekleyebilir misiniz? – honk

+0

hey, size [link] (https://www.google.com/search?q=) tarafından döndürülen içeriği size göndereceğime inanıyorum. –

+0

Kodu, @JoshM tarafından verilen cevaptan yeniden kullanıyor gibisiniz. Ancak, kodu değiştirdiniz ve genişletin. Bunu yapmanın nedeni neydi? Kodunuz @JoshM'inkinden daha iyi/farklı mı? Böyle bir açıklama, okuyucuların çözümünüzü anlamalarına yardımcı olacaktır. – honk

0

Yapabileceğiniz bir şey, başlamak için programatik olarak gerçek bir Google araması gerçekleştirmektir. Bunu yapmanın en kolay yolu, URL'ye https://www.google.com/search?q=QUERY_HERE erişmek ve daha sonra bu sayfanın sonuç sayımını kazmaktır. kullanım için

private static int getResultsCount(final String query) throws IOException { 
    final URL url = new URL("https://www.google.com/search?q=" + URLEncoder.encode(query, "UTF-8")); 
    final URLConnection connection = url.openConnection(); 
    connection.setConnectTimeout(60000); 
    connection.setReadTimeout(60000); 
    connection.addRequestProperty("User-Agent", "Mozilla/5.0"); 
    final Scanner reader = new Scanner(connection.getInputStream(), "UTF-8"); 
    while(reader.hasNextLine()){ 
     final String line = reader.nextLine(); 
     if(!line.contains("<div id=\"resultStats\">")) 
      continue; 
     try{ 
      return Integer.parseInt(line.split("<div id=\"resultStats\">")[1].split("<")[0].replaceAll("[^\\d]", "")); 
     }finally{ 
      reader.close(); 
     } 
    } 
    reader.close(); 
    return 0; 
} 

, sen böyle bir şey yapsın: Burada

bunun nasıl hızlı bir örnektir

final int count = getResultsCount("horses"); 
System.out.println("Estimated number of results for horses: " + count); 
+2

teşekkür, bu iyi görünüyor. Ancak AFAIR hizmet şartları buna izin vermemektedir. Onlar mı? Onlar gibi bir şey sadece Google GUI'leri ve/veya API'leri kullanmaları gerektiğini söylüyorlar… – mbee

+0

Elbette ki böyle olabilir, ama niyetinizin ne olduğuna bağlı olduğunu düşünüyorum. Bu, şartlarından herhangi birinin ihlal edildiğinden emin değilim, ama eminim ki emin olmak için ona güvenmelisiniz. –

+10

FYI. Bu yaklaşım sonunda 503 Hata ve bir captcha yol açar. – Quickredfox

İlgili konular