【问题标题】:Getting more than 10 results by Google Custom Search API V1 in Java通过 Java 中的 Google 自定义搜索 API V1 获得 10 多个结果
【发布时间】:2013-06-04 19:17:33
【问题描述】:

我正在使用 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 参数。但他们正在制造问题。在这里,我无法理解将 numstart 参数放在 url 中的哪个位置。它总是给出 HTTP 400,即错误请求。我已阅读文档页面,也没有明确说明将这两个参数放在 Url 中的何处。

因此,如果有人帮助我解决这个问题,我将不胜感激。谢谢。

【问题讨论】:

    标签: java google-search-api


    【解决方案1】:

    你不能那样做。 num 最多只能是 10。请参阅

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

    num - 无符号整数
    要返回的搜索结果数。 有效值是介于 1 和 10 之间的整数。

    为了显示更多结果,Google 建议进行多次调用,并根据需要增加 start 参数:

    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。

    【讨论】:

    • 是的,但我不明白应该将 start 参数放在 URL 中的哪个位置,因为当我在 URL 的末尾附加 start=0 或 start=11 时,如下所示:googleapis.com/customsearch/v1?key="+key+ "&cx= "+ cx +"&q="+ searchText+"&alt=json"+"&start="+0,它给出 HTTP 状态 400,即错误请求。那么你能告诉我如何使用 start 参数来构建这个 url。
    • 在您的代码中,打印出您正在使用的 URL。类似 System.out.println(url.toString());然后将其复制并粘贴到浏览器中。它将以 JSON 格式向您显示完整的错误,如下所示(一个示例 - 我只是省略了参数“q”来获取它)。如果您无法解决问题,请在此处发布您得到的结果。 {“错误”:{“错误”:[{“域”:“全局”,“原因”:“必需”,“消息”:“必需参数:q”,“位置类型”:“参数”,“位置” : "q" } ], "code": 400, "message": "必填参数:q" } }
    • 由 Google 巧妙设计。让我们做更多的请求,而不是返回更多的结果... -.-
    • 哈哈对@simon?我不敢相信它需要以这种方式完成。地狱发出更多的 API 请求对任何人来说都更好吗?即使对于谷歌...知道他们为什么选择将每个搜索请求的结果设置为最多 10 个的原因会很有趣
    【解决方案2】:

    首先,Google 说:“本节总结了可用于 JSON/Atom 自定义搜索 API 的查询参数。所有参数值都需要进行 URL 编码。” https://developers.google.com/custom-search/v1/using_rest#query-params 意思是“?”之后的所有内容应该使用相当于设置 urlencoding 标准的 php url 编码器进行编码。问题是 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", "~");
    

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

    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 之间。

    【讨论】:

    • 是的,先生,我已经尝试过您建议的第一个方法,即我在 URL 中的数字周围加上引号。但现在它仍然给出相同的错误代码 400,即错误请求。你自己试过吗?
    • 我之前用过谷歌图片搜索api,使用起来完全一样,除了需要api key和base url。正如其他回答者所说,我忘了提到您的 num 参数必须为 10 或更少。如果您省略 num 参数,它甚至应该可以工作,只要它在 0 和 10 之间。我想澄清一下,只有在查询中有空格(它们更改为“%20”)和其他一些特殊情况时,才需要 url 编码。在这种情况下,参数的顺序也无关紧要。祝你好运!
    • 不正确:num 不能大于 10(含);有效值为 1 ~ 10。start 也不能是 0;有效值是大于 0 的整数。
    • 您以错误的方式使用 UrlEncoder。 stackoverflow.com/a/10786112/2695414
    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多