2016-05-22 15 views
0

Ich habe den Kontakt zu benutzerdefinierten Suchmaschinen verloren, seit Google von seiner älteren Suchmaschine API zugunsten der Google Custom Search API gewechselt hat. Ich hoffe, jemand könnte mir sagen, ob ein (ziemlich einfaches) Ziel mit dem neuen Framework erreicht werden kann, und möglicherweise wäre jede Starthilfe großartig.Google Custom Search API - Suchergebnisse

Speziell suche ich ein Programm, das Text aus einer Textdatei einlesen wird, dann fünf Wörter aus dem Dokument in einer Google-Suche verwenden - der Punkt ist herauszufinden, wie viele Ergebnisse aus der Suche entstehen.

Ein Beispiel Eingabe/Ausgabe wäre:

Input: "Das ist mein Suchwort" - Zitate in die Suche einbezogen!

Ausgang: gab es insgesamt 7 Ergebnisse

Vielen Dank, alle, für Ihre Zeit/Hilfe

Antwort

1

Zuerst Sie eine Google Custom Search Projekt erstellen müssen innerhalb Sie Google-Konto. Von diesem Projekt müssen Sie eine benutzerdefinierte Suchmaschine-ID erhalten, die als cx-Parameter bezeichnet wird. Sie müssen auch einen API-Schlüsselparameter abrufen. Beide sind in Ihrem Google Custom Search-API-Projekt in Ihrem Google-Konto verfügbar.

Dann, wenn Sie Java bevorzugen, hier ist ein funktionierendes Beispiel:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 


public class GoogleCustonSearchAPI { 

public static void main(String[] args) throws Exception { 

String key="your_key"; 
String qry="your_query"; 
String cx = "your_cx"; 

//Fetch urls 
URL url = new URL(
"https://www.googleapis.com/customsearch/v1?key="+key+"&cx="+cx+"&q="+ qry +"&alt=json&queriefields=queries(request(totalResults))"); 

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestMethod("GET"); 
conn.setRequestProperty("Accept", "application/json"); 
BufferedReader br = new BufferedReader(new InputStreamReader(
     (conn.getInputStream()))); 
//Remove comments if you need to output in JSON format 
/*String output; 
System.out.println("Output from Server .... \n"); 
while ((output = br.readLine()) != null) { 
    System.out.println(output); 
}*/ 
//Print the urls and domains from Google Custom Search                    String searchResult;   
    while ((searchResult = output.readLine()) != null) { 
     int startPos=searchResult.indexOf("\"link\": \"")+("\"link\": \"").length(); 
     int endPos=searchResult.indexOf("\","); 
     if(searchResult.contains("\"link\": \"") && (endPos>startPos)){ 
      String link=searchResult.substring(startPos,endPos); 
      if(link.contains(",")){ 
       String tempLink = "\""; 
       tempLink+=link; 
       tempLink+="\""; 
       System.out.println(tempLink); 
      } 
      else{ 
       System.out.println(link);     
      } 
      System.out.println(getDomainName(link)); 
     }  
    } 
conn.disconnect();     
} 

public static String getDomainName(String url) throws URISyntaxException { 
    URI uri = new URI(url); 
    String domain = uri.getHost(); 
    return domain.startsWith("www.") ? domain.substring(4) : domain; 
} 

Die "& queriefields = Anfragen (Request (totalResults))" ist es, was den Unterschied macht und gibt sou was Sie brauchen. Beachten Sie jedoch, dass Sie nur 100 Suchanfragen pro Tag kostenlos durchführen können und dass die Ergebnisse der benutzerdefinierten Such-API manchmal von denen der Google-Suche abweichen.

+0

Stört es Sie, wie man "speziell" erhalten die 'cx'? – lonesome

+0

Hier finden Sie die CX-ID: http://www.google.com/cse/manage/all. Dann suchen Sie nach "Meine Suchmaschinen" und wählen Sie dann aus der Liste. Wenn Sie Ihre Suchmaschine auswählen, finden Sie unter Details eine Schaltfläche "Suchmaschinen-ID". Das ist cx. Hoffe ich half !! –

+0

Das war hilfreich. Aber ich habe ein Problem. Ich möchte die Ergebnisse wissen, die Google für eine zufällige Abfrage zurückgibt. Da Googled die Ajax API getötet hat, versuche ich CSE zu benutzen. Aber ich weiß nicht, wie man es benutzt. Ich wähle Google.com, um eine benutzerdefinierte Suchmaschine zu erstellen, die Ergebnisse der Google-Dienste werden jedoch zurückgegeben. Wie soll ich eine benutzerdefinierte Suchmaschine machen, die Ergebnisse zeigt, die Google macht? – lonesome

0

Wenn jemand noch ein Beispiel für CSE benötigt (Google Custom Search Engine) API, das funktioniert Methode

public static List<Result> search(String keyword){ 
    Customsearch customsearch= null; 


    try { 
     customsearch = new Customsearch(new NetHttpTransport(),new JacksonFactory(), new HttpRequestInitializer() { 
      public void initialize(HttpRequest httpRequest) { 
       try { 
        // set connect and read timeouts 
        httpRequest.setConnectTimeout(HTTP_REQUEST_TIMEOUT); 
        httpRequest.setReadTimeout(HTTP_REQUEST_TIMEOUT); 

       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    List<Result> resultList=null; 
    try { 
     Customsearch.Cse.List list=customsearch.cse().list(keyword); 
     list.setKey(GOOGLE_API_KEY); 
     list.setCx(SEARCH_ENGINE_ID); 
     Search results=list.execute(); 
     resultList=results.getItems(); 
    } 
    catch ( Exception e) { 
     e.printStackTrace(); 
    } 
    return resultList; 
} 

diese Methode liefert Liste der Ergebnisobjekte, so kann man durch sie

List<Result> results = new ArrayList<>(); 

    try { 
     results = search(QUERY); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    for(Result result : results){ 
     System.out.println(result.getDisplayLink()); 
     System.out.println(result.getTitle()); 
     // all attributes 
     System.out.println(result.toString()); 
    } 

ich benutze gradle Abhängigkeiten laufen kann

dependencies { 
compile 'com.google.apis:google-api-services-customsearch:v1-rev57-1.23.0' 
} 

Vergessen Sie nicht, Ihren eigenen GOOGLE_API_KEY zu definieren, SEARCH_ENGINE_ID (cx), QUERY und HTTP_REQUEST_TIMEOUT (dh private static final int HTTP_REQUEST_TIMEOUT = 3 * 600000;)

Verwandte Themen