java - 从freebase请求大量数据-Java

标签 java freebase

我尝试从 freebase 请求大量数据。但我收到错误消息“HTTP 响应代码:403”。以前有人遇到过类似的问题吗?

这是我的代码

私有(private)静态最终字符串service_url =“https://www.googleapis.com/freebase/v1/mqlread”;

public static void main(String[] args) 
{
    try
    {
        String cursor = "";
        String urlStr_initial = service_url + "?query=" + URLEncoder.encode(getQuery(), "UTF-8") + "&cursor";
        URL url = new URL(urlStr_initial);
        List<Freebase> list = new ArrayList<Freebase>();
        Freebase f_b;
        do
        {
            HttpURLConnection  url_con = (HttpURLConnection)url.openConnection();
            url_con.addRequestProperty("User-Agent", "Mozilla/4.76");

            StringBuilder str_builder = new StringBuilder();        
            BufferedReader reader = new BufferedReader(new InputStreamReader(url_con.getInputStream()));

            String line;
            while((line = reader.readLine()) != null)
            {
                str_builder.append(line);
            }
            String response = str_builder.toString();
            JSONObject j_object = new JSONObject(response);

            if(j_object.has("result"))
            {
                JSONArray j_array = j_object.getJSONArray("result");
                for(int i = 0; i < j_array.length(); i++)
                {
                    JSONObject j_o = j_array.getJSONObject(i);
                    if(j_o.has("id") == true && j_o.has("name"))
                    {
                        String id = j_o.getString("id");
                        String name = j_o.getString("name");
                        System.out.println("ID: " + id + "   /   Name:" + name);
                        f_b = new Freebase(id, name);
                        if(f_b != null)
                        {
                            list.add(f_b);
                        }
                        else
                        {
                            System.out.println("Null value in Freebase");
                        }
                    }
                }
            }
            else
            {
                System.out.println("There is no \"result\" key in JASON object");
            }

            if(j_object.has("cursor"))
            {
                cursor = j_object.get("cursor").toString();
            }
            else
            {
                cursor = "false";
            }

            String urlStr = urlStr_initial + "=" + cursor;
            url = new URL(urlStr);
        }while( !cursor.equalsIgnoreCase("false"));

        if(list != null)
        {
            TextFile tf = new TextFile();
            tf.writeToFile(list);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

private static String getQuery()
{
    return "[{"
            + "\"name\": null,"
            + "\"id\": null,"
            + "\"type\":\"/people/person\","
            + "\"limit\": 500"
            + "}]";
}

最佳答案

您没有说明什么是“大”,但该 API 并不是为批量下载而设计的。您应该为此使用数据转储。

HTTP 响应代码中通常包含更详细的错误消息。例如,如果显示 403 - 禁止 - 需要 API key ,则意味着您没有包含 API key (我看不到您将其包含在代码中的位置)。如果显示 403 - 禁止 - 超出配额,则表示您已超出请求配额(您可以在 API 控制台上查看剩余的配额)。

关于java - 从freebase请求大量数据-Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15996162/

相关文章:

java - Minecraft forge 自动设置 _JAVA_OPTIONS 环境变量

java - 对 RecyclerView 的更改导致此错误 :E/RecyclerView: No adapter attached; skipping layout

java - 在 Java 中使用 Freebase API

freebase - 如何在中期之前在 freebase 中搜索

Freebase:在一次查询中以某种语言获取名称和维基百科 ID

Java:对象的数组列表以及获取自动创建的复选框的值/属性

java - 在 Selenium 测试中使用 setUp 和 tearDown

Java 3D Hello World - Jar 卡住

python - 确定 Freebase MID 值的分类层次结构级别

java - 如何配置 freebase java 客户端通过代理连接?