2013-08-13 3 views
5

Ich möchte die geschätzte Ergebnisanzahl für bestimmte Google-Suchanfragen (im gesamten Web) mit Java-Code abrufen.einfachste (legale) Möglichkeit, die Google-Suchergebniszahl programmgesteuert zu erhalten?

Ich muss nur sehr wenige Abfragen pro Tag, so zunächst Google Web Search API, obwohl veraltet, schien gut genug zu sein (siehe z. B. How can you search Google Programmatically Java API). Wie sich jedoch herausstellte, unterscheiden sich die von dieser API zurückgegebenen Zahlen stark von denen, die von www.google.com zurückgegeben werden (siehe z. B. http://code.google.com/p/google-ajax-apis/issues/detail?id=32). Also diese Zahlen sind ziemlich nutzlos für mich.

Ich versuchte auch Google Custom Search engine, die das gleiche Problem aufweist.

Was ist Ihrer Meinung nach die einfachste Lösung für meine Aufgabe?

Antwort

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

Könnten Sie bitte etwas zu Ihrer Lösung hinzufügen? – honk

+0

hey, wenn Sie möchten, dass ich Ihnen den Inhalt von [link] (https://www.google.com/search?q=) im Objekt zurückschicke, werde ich es sicher tun. –

+0

Sie scheinen den Code aus der Antwort von @JoshM wieder verwendet zu haben. Sie haben den Code jedoch geändert und erweitert. Was war der Grund dafür? Was ist besser/anders als @JoshM? Eine solche Erklärung würde den Lesern helfen, Ihre Lösung zu verstehen. – honk

0

Nun, etwas, was Sie tun können, ist eine tatsächliche Google-Suche programmgesteuert durchführen zu Beginn. Der einfachste Weg, dies zu tun, wäre, auf die URL https://www.google.com/search?q=QUERY_HERE zuzugreifen und dann die Ergebniszählung von dieser Seite abzukratzen.

Hier ein kleines Beispiel dafür, wie das zu tun:

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

Für die Nutzung, Sie so etwas wie tun würde:

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

Danke, das sieht gut aus. Aber AFAIR die Bedingungen des Dienstes erlauben dies nicht. Tun sie? Sie sagen etwas wie man muss nur Google GUIs und/oder APIs verwenden ... – mbee

+0

Sicherlich könnte das der Fall sein, aber ich denke, es hängt davon ab, was Ihre Absicht ist. Ich bin mir nicht sicher, ob dies gegen ihre Bedingungen verstößt oder nicht, aber ich denke, Sie sollten sich wahrscheinlich damit befassen, um sicherzustellen, dass es sicher ist. –

+10

FYI. Dieser Ansatz führt schließlich zu einem Fehler 503 und einem Captcha. – Quickredfox

Verwandte Themen