Google Custom Search API - Search Results

最后都变了- 提交于 2020-01-06 20:00:56

问题


I have somewhat lost touch with custom search engines ever since Google switched from its more legacy search engine api in favor of the google custom search api. I'm hoping someone might be able to tell me whether a (pretty simple) goal can be accomplished with the new framework, and potentially any starting help would be great.

Specifically, I am looking to write a program which will read in text from a text file, then use five words from said document in a google search - the point being to figure out how many results accrue from said search.

An example input/output would be:

Input: "This is my search term" -- quotations included in the search!

Output: there were 7 total results

Thanks so much, all, for your time/help


回答1:


First you need to create a Google Custom Search project inside you google account. From this project you must obtain a Custom Search Engine ID , known as cx parameter. You must also obtain a API key parameter. Both of these are available from your Google Custom Search API project inside your google account.

Then, if you prefer Java , here's a working example:

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

The "&queriefields=queries(request(totalResults))" is what makes the difference and gives sou what you need. But keep in mind that you can perform only 100 queries per day for free and that the results of Custom Search API are sometimes quite different from the those returned from Google.com search




回答2:


If anybody would still need some example of CSE (Google Custom Search Engine) API, this is working method

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

This method returns List of Result Objects, so you can iterate through it

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

I use gradle dependencies

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

Don't forget to define your own GOOGLE_API_KEY, SEARCH_ENGINE_ID (cx), QUERY and HTTP_REQUEST_TIMEOUT (ie private static final int HTTP_REQUEST_TIMEOUT = 3 * 600000;)



来源:https://stackoverflow.com/questions/37379511/google-custom-search-api-search-results

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!