2015-01-25 3 views
1

Моя цель - написать приложение Java, которое проверяет следующий URL-адрес: https://familysearch.org/pal:/MM9.3.1/TH-1971-28699-12927-58 можно сохранить изображение (копию страницы, принадлежащей старой книге), и перейти к следующей странице, повторив процесс , Можно вручную загрузить изображения, но я хочу автоматизировать эту задачу. Проблема в том, что я мало что знаю о сети, поэтому мне тяжело.Осмотрите URL-адрес и скачайте изображение

Я использовал веб-инспектора моего браузера, чтобы увидеть ресурсы в URL-адресе, и смог сделать вывод, что изображение можно найти здесь: https://familysearch.org/pal:/MM9.3.1/TH-1971-28699-12927-58.jpg.

Так что я попытался следующий фрагмент кода:

public static void saveImage(String imageUrl, String destinationFile) throws IOException { 
     URL url = new URL(imageUrl); 
     InputStream is = url.openStream(); 
     OutputStream os = new FileOutputStream(destinationFile); 

     byte[] b = new byte[2048]; 
     int length; 

     while ((length = is.read(b)) != -1) { 
      os.write(b, 0, length); 
     } 

     is.close(); 
     os.close(); 
    } 

public static void main(String args[]) throws Exception { 

     String imageUrl = "https://familysearch.org/pal:/MM9.3.1/TH-1971-28699-12927-58.jpg"; 
     String destinationFile = "./image.jpg"; 

     saveImage(imageUrl, destinationFile); 
} 

Что же на самом деле не работает. Я получил следующий вывод:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 500 for URL: https://familysearch.org/pal:/MM9.3.1/TH-1971-28699-12927-58.jpg 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
at java.net.URL.openStream(URL.java:1037) 
at mainpackage.Main.saveImage(Main.java:25) 
at mainpackage.Main.main(Main.java:44) 

Так у меня есть две проблемы: первая из которых, как действовать, чтобы загрузить изображение, а второй, как найти URL для следующего изображения, как URL-адреса дону Кажется, что он соответствует шаблону (например, счету).

+0

похоже, что сервер блокирует горячую ссылку. что означает, что они не хотят делать это, если это так. – Steve

+0

Но как мой браузер может получить доступ к изображению? Я могу сделать это, щелкнуть правой кнопкой мыши и «сохранить как». – Thiago

+0

ну idk..не уверен, как это работает, только слышал об этом. Но 500-код означает внутреннюю ошибку сервера, и это не должно происходить при загрузке изображений, которая является прямым доступом. – Steve

ответ

3

Вот рабочий пример:

import javax.net.ssl.HttpsURLConnection; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 

public class StackOverflowTest { 

    public static void saveImage(final String imageUrl, final String destinationFile) throws IOException { 
     final URL url = new URL(imageUrl); 
     final HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 

     urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); 
     urlConnection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
     urlConnection.setInstanceFollowRedirects(true); 

     final InputStream is = urlConnection.getInputStream(); 
     final OutputStream os = new FileOutputStream(destinationFile); 

     byte[] b = new byte[2048]; 
     int length; 

     while ((length = is.read(b)) != -1) { 
      os.write(b, 0, length); 
     } 

     is.close(); 
     os.close(); 
    } 

    public static void main(final String args[]) throws Exception { 

     final String imageUrl = "https://familysearch.org/pal:/MM9.3.1/TH-1971-28699-12927-58.jpg"; 
     final String destinationFile = "./image.jpg"; 

     saveImage(imageUrl, destinationFile); 
    } 
} 

Вопрос заключается в том, что веб-сервер ожидает заголовок Accept, и терпел неудачу, так как он не мог найти его, возвращая 500 в ответ. (Также URL-адрес изображения выполняет перенаправление.)

Что касается поиска следующего изображения: это более сложная задача. Если нет простого способа идентифицировать следующий образ, вам, вероятно, придется искать в XML/HTML-парсерах для Java. Хорошим, быстрым является Jsoup (http://jsoup.org/).

+0

Большое спасибо! Теперь я попытаюсь найти решение для второй проблемы! – Thiago