Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查URL并下载图像_Java_Image_Web_Web Crawler - Fatal编程技术网

Java 检查URL并下载图像

Java 检查URL并下载图像,java,image,web,web-crawler,Java,Image,Web,Web Crawler,我的目标是编写一个java应用程序来检查以下URL:能够保存图像(属于旧书的页面的副本)并导航到下一页,重复该过程。可以手动下载图像,但我想自动完成这项任务。问题是我对网络了解不多,所以我很难做到 我使用浏览器的web检查器查看URL中的资源,并得出结论,可以在此处找到图像: 因此,我尝试了以下代码片段: public static void saveImage(String imageUrl, String destinationFile) throws IOException {

我的目标是编写一个java应用程序来检查以下URL:能够保存图像(属于旧书的页面的副本)并导航到下一页,重复该过程。可以手动下载图像,但我想自动完成这项任务。问题是我对网络了解不多,所以我很难做到

我使用浏览器的web检查器查看URL中的资源,并得出结论,可以在此处找到图像:

因此,我尝试了以下代码片段:

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似乎没有遵循模式(如计数)。

以下是一个工作示例:

导入javax.net.ssl.HttpsURLConnection;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.net.URL;
公共类堆栈溢出测试{
公共静态void saveImage(最终字符串imageUrl,最终字符串destinationFile)引发IOException{
最终URL=新URL(imageUrl);
最终的HttpsURLConnection urlConnection=(HttpsURLConnection)url.openConnection();
urlConnection.setRequestProperty(“用户代理”、“Mozilla/5.0(Windows NT 6.1)AppleWebKit/537.36(KHTML,如Gecko)Chrome/41.0.2228.0 Safari/537.36”);
setRequestProperty(“Accept”,“text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8”);
urlConnection.setInstanceFlowRedirects(true);
最终的InputStream为=urlConnection.getInputStream();
最终OutputStream os=新文件OutputStream(destinationFile);
字节[]b=新字节[2048];
整数长度;
而((长度=is.read(b))!=-1){
os.write(b,0,长度);
}
is.close();
os.close();
}
公共静态void main(最终字符串args[])引发异常{
最终字符串imageUrl=”https://familysearch.org/pal:/MM9.3.1/TH-1971-28699-12927-58.jpg”;
最终字符串destinationFile=“./image.jpg”;
saveImage(imageUrl,destinationFile);
}
}
问题是web服务器需要
Accept
头,但由于找不到它而失败,返回500响应。(此外,图像URL会执行重定向。)


至于寻找下一张图片:这是一项更复杂的任务。如果没有一种简单的方法来识别下一个图像,那么您可能需要研究Java的XML/HTML解析器。一个好的、快速的方法是Jsoup()。

看起来服务器正在阻止热链接。这意味着如果是这样的话,他们不想让你这么做,但是我的浏览器如何访问图像呢?我可以这样做,右键点击并“另存为”。嗯,idk..不太确定这是如何工作的,只听说过它。但是500代码意味着内部服务器错误,这不应该发生在直接访问的图像下载上。服务器可能正在检查您的用户代理(或其他HTTP元数据),并阻止基于用户代理的请求。现在,您没有设置任何用户代理。(但您的浏览器在发出请求时确实设置了用户代理。)如何从我的代码中进行设置?非常感谢!现在我将尝试找到第二个问题的解决方案!