java - Google 自定义搜索 API,如何使用 Java 以编程方式遍历 google 结果页面?

标签 java json parsing google-search-api google-custom-search

以下代码取自:Java code for using google custom search API 。它可以正确提取 Google 结果页面中第一页的前 10 个结果。

public static void main(String[] args) throws Exception {      
String key="YOUR KEY";     
String qry="Android";     
URL url = new URL("https://www.googleapis.com/customsearch/v1?
key="+key+ "&cx=013036536707430787589:_pqjad5hr1a&q="+ qry + "&alt=json");     

HttpURLConnection conn = (HttpURLConnection) url.openConnection();    
conn.setRequestMethod("GET");     
conn.setRequestProperty("Accept", "application/json");     
BufferedReader br = 
new BufferedReader(new InputStreamReader( (conn.getInputStream())));      
String output;     
System.out.println("Output from Server .... \n");     
while ((output = br.readLine()) != null) 
 {          
    if(output.contains("\"link\": \""))
    {                             
     String link=output.substring(output.indexOf("\"link\": \"")+
     ("\"link\": \"").length(), output.indexOf("\","));             
     System.out.println(link);       //Will print the google search links         
    }          
 }     
conn.disconnect();                               
}

我想弄清楚如何遍历所有结果页面?通过搜索 https://developers.google.com/custom-search/v1/using_rest我发现查询中的 start 参数引用索引,很明显,通过在循环中更改此值可以达到目的,但会花费我对每个页面进行查询(这不应该是这样,因为它不是一个新查询,它是相同的查询,但只是新页面)。另外,我发现谷歌提到如果查询成功,响应数据包含总结果的值totalResults,但他们提到这是估计数字。那么,如何才能从这项服务中受益并获得实际结果数或页面数以便遍历所有结果?我为每个页面发出新查询没有任何意义。

最佳答案

  1. 您应该使用 JSON 解析器从结果中提取数据,而不是自己解析结果。

  2. Google 不会一次返回单个查询的所有结果。如果您搜索 Java,大约有 214,000,000 个结果?将它们全部归还需要好几天的时间,而且无论如何你也无法用它们做任何有意义的事情。因此,如果有多个页面,您必须为每个页面执行一个新查询,就像使用浏览器进行 Google 搜索时所做的那样。大多数时候,有趣的结果都在第一页或第二页。返回超过此数量会浪费资源。

  3. Google 不知道结果的确切数量。它返回一个估计值。计算确切的结果数量太困难了。知道有 214,000,001 个结果而不是 214,000,002 个结果并没有任何值(value),而且确切的数字无论如何都会立即过时。

关于java - Google 自定义搜索 API,如何使用 Java 以编程方式遍历 google 结果页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11290033/

相关文章:

java - mpandroidchart LineData 无法应用于 (java.util.ArrayLIst<java.lang.String>

java - 在 Android 应用程序中设置和打开 fragment 的问题

java - 同步关键字 - 它是如何工作的?

java - 忽略 jackson 属性(property)

java - 使用第一行文本值java获取第二行xml

c++ - 如何解决 YACC 中的 Shift/Reduce 冲突

java - Xmlpull Java,解析互联网上的xml文件

java - 子类java中具有相同名称的属性

javascript - 显示表单上所有选定单选按钮的值

asp.net - 在 Asp.Net MVC Controller 中反序列化 JSON 对象