通过Java中的Google Custom Search API V1获得超过10个结果

时间:2013-06-04 19:17:33

标签: java google-search-api

我正在使用Java中的Google自定义搜索API来获取Google的结果以回应查询。我在其他帖子的帮助下编写了这段代码,代码如下:

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

问题是每当我使用上面没有num和start参数的代码时,它正在正确执行,但只给出前10个结果。所以我使用了num和start参数。但他们正在制造问题。在这里,我无法理解在URL中放置 num start 参数的位置。它始终给出HTTP 400即Bad Request。我已经阅读了“文档”页面,也没有明确说明将这两个参数放在Url中的位置。

所以,如果有人帮助我解决这个问题,我将非常感激。谢谢。

2 个答案:

答案 0 :(得分:24)

你不能这样做。 num只能是最多10个。参见

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

  

num - 无符号整数
  要返回的搜索结果数。   有效值为1到10之间的整数。

为了显示更多结果,Google建议拨打多个电话,根据需要增加开始参数:

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

  

开始 - 无符号整数   要返回的第一个结果的索引。有效值是从1开始的整数(默认值),第二个结果是2,依此类推。例如& start = 11给出第二页结果,默认“num”值为每页10个结果。注意:对于使用JSON API的任何查询,将返回不超过100个结果,即使超过100个文档与查询匹配,因此将(start + num)设置为大于100将产生错误。请注意,num的最大值为10。

答案 1 :(得分:-1)

首先,Google表示:“本节概述了可与JSON / Atom自定义搜索API一起使用的查询参数。所有参数值都需要进行URL编码。” https://developers.google.com/custom-search/v1/using_rest#query-params意思是“?”之后的一切应使用等效的php url编码器进行编码,该编码器设置urlencoding的标准。事情是Java的类URLEncoder不太对,你必须做几个replaceAll。您需要对输入执行此操作:

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

注意数字周围有引号。 如果从变量中获取这些变量,请使用以下命令:

String thenum = Integer.toString(theinteger);

然后是正确的编码

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

然后将其添加到原始未编码的网址:

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

总之,您的代码将如下所示:

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

我希望这适合你。我做了一些与旧的弃用的图像api非常相似的东西,但是这个概念保持不变,我查看了新的文档。 :)

编辑: 确保num参数介于0和10之间。

相关问题