2017-01-21 5 views
3

Нам нужно сделать снимок с национальной географической фотографии дня для андроидного проекта. Мы используем jsoup для этого, и он работает на других сайтах и ​​фотографиях, которые мы пытались получить, но не с этим. http://www.nationalgeographic.com/photography/photo-of-the-dayКак получить национальную географическую фотографию дня с jsoup в android

Это ссылка на фотографию, которую мы должны получить. Если вы проверите страницу, вы увидите, что элемент, содержащий ссылку, имеет несколько ссылок на фотографии разных размеров. Поэтому мы подозреваем, что это проблема. Вот элемент со всеми ссылками:

<source srcset="http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU6FOW3O0jR-t4LlattRw52wBmvg/ 240w, http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU6cKxp_v-TRYywK8kMonNsWFMiA/ 320w, http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU76IwFM89MgsU2CsVpABa94yrwg/ 500w, http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU7Lx-mjq8_Dk9iI7H4kcoPo-SmA/ 640w, http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU4kJMUl3WmTvlAFqfo4wIlDssvw/ 800w, http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU6-HA9n31rVvmbG5touqPt59wY3s/ 1024w, http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU6-dIS7lLTB0CSOM4O0wlvLx9pDnb/ 1600w, http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU6FcgiBNz-Nj7_J7e61F6_8oUXwoV/ 2048w" sizes="730px" data-reactid=".5.0.1.0.0.$http=2//www=1nationalgeographic=1com/photography/photo-of-the-day/2017/01/boy-buffalo-thailand.0.0.0.0.0.0.0.0"> 

Как вы можете видеть, есть несколько ссылок, поэтому мы также пытались разделить код и получить только один из них, но jsoup не похоже, чтобы получить какой-либо кода в первую очередь. Вот код:

Document doc = Jsoup.connect("http://www.nationalgeographic.com/photography/photo-of-the-day").get(); 
      Elements img = doc.select("div.modules-images__placeholder source[srcset]"); 

      imgSrc = img.attr("srcset"); //srcset 

      String[] splitStr = imgSrc.split("\\s+"); 
      int n = splitStr.length; 
      imgSrc = splitStr[n-2]; 

      //Download Image from URL 
      InputStream input = new java.net.URL(imgSrc).openStream(); 
      //Decode Bitmap 
      bitmap = BitmapFactory.decodeStream(input); 
      myWallpaperManager.setBitmap(bitmap); 

ответ

0

У меня есть решение. Кроме того, если вы хотите, чтобы получить различные размеры, просто измените 0 на другой индекс, и он будет работать:

String imgSrc = img.attr("srcset").split(",")[0].replaceAll(" \\d+w", ""); 

Это возвращение http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU6FOW3O0jR-t4LlattRw52wBmvg/ в данный момент.

EDIT: Он работает, если вы можете получить атрибут srcset правильно. По какой-то причине Jsoup не получает его.

+0

Ваш ответ выглядел неплохо, но он все еще не работает. Если мы попробуем запустить этот код http://prnt.sc/dyl8z7, чтобы получить еще одну случайную фотографию, она успешно берет ее и помещает в качестве фона на телефон. Но если мы запустим код с национальной географической ссылкой и вашим решением http://prnt.sc/dyl81r, он ничего не делает ... – Donev

+0

Из того, что я вижу, вы отправили одну и ту же фотографию дважды. На мой ответ я предполагал, что img.attr («srcset») возвращает то, что является атрибутом srcset (который я почти уверен, что он делает). Я не тестировал Jsoup, но он должен работать одинаково. Я попытаюсь посмотреть, что происходит, как только я вернусь домой. – Rexcantor64

+0

Да, я отредактировал комментарий и сейчас две разные фотографии.Я подозреваю, что проблема в том, что он не возвращает то, что находится внутри атрибута srcset. Я не очень опытный и не знаю, как это проверить, поэтому, если вы сможете заглянуть в него, когда будете дома, это будет очень надежным. Благодарю. – Donev

0

Мой другой ответ не работал, потому что Jsoup не получал всю страницу. Я нашел URL JSON статьи, поэтому я сделал простой код, чтобы получить URL:

try { 
     JSONObject jobject = readJsonFromUrl(
       "http://www.nationalgeographic.com/photography/photo-of-the-day/_jcr_content/.gallery.json"); 
     JSONObject article = jobject.getJSONArray("items").getJSONObject(0); 
     String url = article.getString("url") + article.getString("originalUrl"); 
     System.out.println(url); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Вам нужно добавить эти методы к любому классу:

private static String readAll(Reader rd) throws IOException { 
    StringBuilder sb = new StringBuilder(); 
    int cp; 
    while ((cp = rd.read()) != -1) { 
     sb.append((char) cp); 
    } 
    return sb.toString(); 
} 

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { 
    InputStream is = new URL(url).openStream(); 
    try { 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
     String jsonText = readAll(rd); 
     JSONObject json = new JSONObject(jsonText); 
     return json; 
    } finally { 
     is.close(); 
    } 
} 

Просто примените URL-адрес к вашему текущему коду, и он должен работать.

Методы readAll и readJsonFromUrl от this Ответ.

РЕДАКТИРОВАТЬ:

Для того, чтобы получить другой размер, использование:

String url = article.getString("url") + article.getJSONObject("sizes").getString("2048"); 

2048 может быть заменен либо 240, 320, 500, 640, 800, 1024 и 1600.

Не уверен, что размеры меняются каждый день, но если да, проверьте JSON, чтобы узнать, какие из них доступны.

+0

где именно мы добавляем эти функции в наш проект студии Android? – Donev

+0

@ Donev Да, это смутно. Я отредактирую пост ... – Rexcantor64

+0

@Donev Отредактировано ... – Rexcantor64