Getting more than 10 results by Google Custom Search API V1 in Java

﹥>﹥吖頭↗ 提交于 2019-12-20 11:56:21

问题


I am using Google Custom Search API in Java to get results of Google in response to a query. I have written this code with the help of other posts, code is as follows:

    url = new URL("https://www.googleapis.com/customsearch/v1?key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+0+"&num="+30);
    HttpURLConnection conn2 = (HttpURLConnection) url.openConnection();
    System.out.println("Connection opened!");
    conn2.setRequestMethod("GET");
    conn2.setRequestProperty("Accept", "application/json");
    BufferedReader br = new BufferedReader(new InputStreamReader(
    (conn2.getInputStream())));

The problem is that whenever I am using the above code without num and start parameters it is executing properly, but giving only top 10 results. So I have used num and start parameters. But they are creating problems. Here I cannot understand where to put the num and start parameters in the url. It is always giving HTTP 400 i.e. Bad Request. I have read the Documentation page, there also no clear instruction is given about where to put these two parameters in Url.

So if anyone helps me to solve this problem I will be really grateful. Thank you.


回答1:


You can't do it that way. num can only be a maximum of 10. See

https://developers.google.com/custom-search/json-api/v1/reference/cse/list#num

num - unsigned integer
Number of search results to return. Valid values are integers between 1 and 10, inclusive.

To show more results, Google suggests making multiple calls, incrementing the start parameter as needed:

https://developers.google.com/custom-search/json-api/v1/reference/cse/list#start

start - unsigned integer The index of the first result to return. Valid value are integers starting 1 (default) and the second result is 2 and so forth. For example &start=11 gives the second page of results with the default "num" value of 10 results per page. Note: No more than 100 results will ever be returned for any query with JSON API, even if more than 100 documents match the query, so setting (start + num) to more than 100 will produce an error. Note that the maximum value for num is 10.




回答2:


First off, Google says: "The query parameters you can use with the JSON/Atom Custom Search API are summarized in this section. All parameter values need to be URL encoded." https://developers.google.com/custom-search/v1/using_rest#query-params Meaning that everything after the "?" should be encoded with an equivalent of the php url encoder which sets the standard for urlencoding. Thing is that Java's class URLEncoder isn't quite right, you have to do a couple of replaceAll's. You need to do this to your input:

String queryArguments = "key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+"0"+"&num="+"30";

Notice how there are quotes around the numbers. If you get these from variables use the following:

String thenum = Integer.toString(theinteger);

And then the proper encoding

String addition = URLEncoder.encode(queryArguments, "UTF-8")
.replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~");

Then you add that to the original unencoded url:

String url = "https://www.googleapis.com/customsearch/v1?"
String total = url + addition;

In conclusion your code will look like this:

String query = URLEncoder.encode("key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+"0"+"&num="+"30"), "UTF-8").replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~");
URL url = new URL("https://www.googleapis.com/customsearch/v1?" + query);
HttpURLConnection conn2 = (HttpURLConnection) url.openConnection();
System.out.println("Connection opened!");
conn2.setRequestMethod("GET");
conn2.setRequestProperty("Accept", "application/json");
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn2.getInputStream())));

I hope this works for you. I did something very similar with the old deprecated image api, but the concept holds the same and I looked at the new docs. :)

EDIT: Make sure that your num parameter is between 0 and 10 inclusive.



来源:https://stackoverflow.com/questions/16925762/getting-more-than-10-results-by-google-custom-search-api-v1-in-java

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