2013-08-13 31 views
5

Chcę uzyskać szacowaną liczbę wyników dla niektórych zapytań wyszukiwarki Google (w całym Internecie) przy użyciu kodu Java.najprostszy (legalny) sposób programowo uzyskać wynik wyszukiwania w Google?

Potrzebuję wykonać tylko kilka zapytań dziennie, więc najpierw Google Web Search API, choć przestarzałe, wydawało się wystarczająco dobre (patrz np. How can you search Google Programmatically Java API). Ale okazało się, że liczby zwracane przez ten interfejs znacznie różnią się od tych zwracanych przez www.google.com (patrz np. http://code.google.com/p/google-ajax-apis/issues/detail?id=32). Te liczby są dla mnie bezużyteczne.

Próbowałem również Google Custom Search engine, który wykazuje ten sam problem.

Co według Ciebie jest najprostszym rozwiązaniem do mojego zadania?

Odpowiedz

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

Czy możesz dodać jakieś wyjaśnienie do swojego rozwiązania? – honk

+0

hej, jeśli chcesz, żebym wysłał Ci zawartość zwróconą przez [link] (https://www.google.com/search?q=) w obiekcie, na pewno to zrobię. –

+0

Wygląda na to, że ponownie użyłeś kodu z odpowiedzi @JoshM. Jednak zmodyfikowałeś i rozszerzyłeś kod. Jaki był tego powód? Jaki jest twój kod lepszy/odmienny od tego z @JoshM? Takie wyjaśnienie pomoże czytelnikom zrozumieć Twoje rozwiązanie. – honk

0

Coś, co można zrobić, to programowo odszukać rzeczywiste wyszukiwanie w Google. Najłatwiejszym sposobem na to jest dostęp do adresu URL https://www.google.com/search?q=QUERY_HERE, a następnie zeskanowanie wyniku odliczania tej strony.

Oto krótki przykład jak to zrobić:

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

Do użycia, by zrobić coś takiego:

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

Dzięki, to wygląda dobrze. Ale AFAIR warunki usługi nie pozwalają na to. Czy oni? Mówią, że trzeba używać tylko Google GUI i/lub API ... – mbee

+0

Z pewnością tak jest, ale myślę, że to zależy od tego, jaki masz zamiar. Nie jestem zbyt pewny, czy to narusza którykolwiek z ich warunków, ale myślę, że powinieneś go sprawdzić, aby upewnić się, że jest bezpieczny. –

+10

FYI. Takie podejście ostatecznie prowadzi do błędu 503 i captcha. – Quickredfox