【问题标题】:Google search via Java Api - Multiple requests通过 Java Api 进行 Google 搜索 - 多个请求
【发布时间】:2011-11-16 15:55:05
【问题描述】:

我来自this question

下面的代码效果不好:

public static void main(String[] args) throws Exception {
    for (int i = 0; i < 15; i++)
    {
        String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
        String search = "test";
        String charset = "UTF-8";

        URL url = new URL(google + URLEncoder.encode(search, charset));
        Reader reader = new InputStreamReader(url.openStream(), charset);
        GoogleResults results = new Gson().fromJson(reader, GoogleResults.class);

        // Show title and URL of 1st result.
        System.out.println(results.getResponseData().getResults().get(0).getTitle());
        System.out.println(results.getResponseData().getResults().get(0).getUrl());
    }
}

如果我运行一次搜索查询就可以正常工作,但是在这个循环中我得到一个空指针异常。

不幸的是,我需要我的程序进行几个查询 :( 我该怎么办?

它在第一个results.getResponseData 处返回NullPointerException

【问题讨论】:

  • 我也面临这个问题。那么如何摆脱它呢?
  • 你不能。这违反了谷歌的服务条款。不过,您可以尝试添加更长的延迟,或者尝试将 IP 发送给 Google。
  • 我也添加了 ip。但仍然无法正常工作。 String address = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&amp;start=0&amp;userip=14.90.136.150&amp;safe=active&amp;rsz=8&amp;q="; 有时它不会给出任何异常并从谷歌搜索文本,但大多数时候它会抛出 NullPointerException。为什么?

标签: java google-search-api


【解决方案1】:

之所以发生这种情况,是因为 Google 积极阻止了涉嫌滥用服务条款的行为。请参阅此处的第 5.3 节:

http://www.google.com/accounts/TOS

如果 Google 检测到您在未经他们同意的情况下通过程序发出搜索请求,他们不会发回结果。您的 JSON 响应将包含以下内容:

{"responseData": null, "responseDetails": "Suspected Terms of Service Abuse. Please see http://code.google.com/apis/errors", "responseStatus": 403}

【讨论】:

  • 但有时它不会给出任何异常并从谷歌搜索文本,有时它会抛出 NullPointerException。为什么?
【解决方案2】:

在使用之前检查以确保results 和其他包含的对象不是null

if ((results != null) && (results.getResponseData() != null) &&
    (results.getResponseData().getResults() != null) &&
    (results.getResponseData().getResults().get(0) != null)) {
    // Show title and URL of 1st result.
    System.out.println(results.getResponseData().getResults().get(0).getTitle());
    System.out.println(results.getResponseData().getResults().get(0).getUrl());
}

【讨论】:

  • 很好。我要问的是 - 为什么结果是 NULL 首先?以及如何避免它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
相关资源
最近更新 更多