2013-04-14 1 views
1

Я попытался запросить большой объем данных из freebase. Но я получил сообщение об ошибке «HTTP-код ответа: 403». Раньше у кого-то была аналогичная проблема?Запросить большое количество данных из freebase - Java

Вот мой код

частная статическая окончательная Строка 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" 
      + "}]"; 
} 

ответ

1

Вы не говорите, что такое «большой», но API не предназначен для массовых загрузок. Для этого вы должны использовать дампы данных.

Обычно появляется сообщение об ошибке с кодом ответа HTTP. Если, например, сказано, что требуется ключ 403 - Forbidden - API, это означает, что вы не включили свой ключ API (я не вижу, где вы его включаете в свой код). Если он говорит, что 403 - Forbidden - превышена квота, значит, вы превысили квоту вашего запроса (вы можете посмотреть консоль API, чтобы узнать, сколько оставшихся квот осталось).