Java 如何修复错误502状态

Java 如何修复错误502状态,java,web,jsoup,Java,Web,Jsoup,我正在使用JSoupJavaHTML解析器从特定URL获取图像。但是一些图像抛出了状态502错误代码,并且没有保存到我的机器上。以下是我使用的代码快照:- String url = "http://www.jabong.com"; String html = Jsoup.connect(url.toString()).get().html(); Document doc = Jsoup.parse(html, url); images = doc.select("img"); for (Ele

我正在使用JSoupJavaHTML解析器从特定URL获取图像。但是一些图像抛出了状态502错误代码,并且没有保存到我的机器上。以下是我使用的代码快照:-

String url = "http://www.jabong.com";
String html = Jsoup.connect(url.toString()).get().html();
Document doc = Jsoup.parse(html, url);
images = doc.select("img");

for (Element element : images) {
        String imgSrc = element.attr("abs:src");
        log.info(imgSrc);
        if (imgSrc != "") {
            saveFromUrl(imgSrc, dirPath+"/" + nameCounter + ".jpg");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                log.error("error in sleeping");
            }
            nameCounter++;
        }
}
saveFromURL函数如下所示:-

public static void saveFromUrl(String Url, String destinationFile) {
    try {
        URL url = new URL(Url);
        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();
    } catch (IOException e) {
        log.error("Error in saving file from url:" + Url);
        //e.printStackTrace();
    }
}
我在互联网上搜索了状态码502,但它说错误是由于坏网关造成的。我不明白。我认为这个错误可能是因为我正在向循环中的图像发送get请求。可能是Web服务器无法处理这么多的负载,所以在未发送前一个图像时拒绝对图像的请求。因此,我尝试在获取每个图像后进行睡眠,但没有成功:(
请给出一些建议

您的问题听起来像是HTTP通信问题,因此您最好尝试使用库来处理通信方面的问题。请参阅

关于您的代码示例的一些说明。您没有使用
URLConnection
对象,因此不清楚Web/代理服务器和干净地关闭资源等的行为。提到的HttpCommon库在这方面会有所帮助


这里似乎也有一些你想用什么就用什么的例子。这不是我个人用过的,但也可能对你有所帮助。

这里有一个完整的代码示例,对我很有用

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.SocketAddress;
import java.net.URL;

public class DownloadImage {

    public static void main(String[] args) {

        // URLs for Images we wish to download
        String[] urls = {
                "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png",
                "http://www.google.co.uk/images/srpr/logo3w.png",
                "http://i.microsoft.com/global/en-us/homepage/PublishingImages/sprites/microsoft_gray.png"
                };

        for(int i = 0; i < urls.length; i++) {
            downloadFromUrl(urls[i]);
        }

    }

    /*
    Extract the file name from the URL
    */
    private static String getOutputFileName(URL url) {

        String[] urlParts = url.getPath().split("/");

        return "c:/temp/" + urlParts[urlParts.length-1];
    }

    /*
    Assumes there is no Proxy server involved.
    */
    private static void downloadFromUrl(String urlString) {

        InputStream is = null;
        FileOutputStream fos = null; 

        try {
            URL url = new URL(urlString);

            System.out.println("Reading..." + url);

            HttpURLConnection conn = (HttpURLConnection)url.openConnection(proxy);

            is = conn.getInputStream(); 

            String filename = getOutputFileName(url);

            fos = new FileOutputStream(filename);

            byte[] readData = new byte[1024];

            int i = is.read(readData);

            while(i != -1) {
                fos.write(readData, 0, i);
                i = is.read(readData);
            }

            System.out.println("Created file: " + filename);
        }
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if(is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    System.out.println("Big problems if InputStream cannot be closed");
                }
            }           
            if(fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    System.out.println("Big problems if FileOutputSream cannot be closed");
                }
            }
        }

        System.out.println("Completed");
    }
}
这是一个没有代理服务器的工作示例

仅当您需要使用代理服务器进行身份验证时在此基础上,您还需要一个额外的类

要使用这个新类,您需要使用以下代码来代替上面所示的对openConnection()的调用

...
try {
    URL url = new URL(urlString);

    System.out.println("Reading..." + url);

    Authenticator.setDefault(new ProxyAuthenticator("username", "password");

    SocketAddress addr = new InetSocketAddress("proxy.server.com", 80);
    Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);

    HttpURLConnection conn = (HttpURLConnection)url.openConnection(proxy);

    ...

非常感谢brad。作为一名新手,我不知道URLConnection对象的事情。我仍然不清楚通过干净地关闭资源,你想说什么。请解释一下,你仍然收到502错误吗?我发布了另一个没有JSoup业务的代码示例供你试用。也许这将有助于确定问题所在。嘿,谢谢Brad,谢谢你解决了这个问题。自从我遇到这个问题以来,我使用jsoup将相对URL更改为绝对URL,这确实解决了我的问题,非常感谢你帮助我并给出了确切的解决方案..干杯\m/
import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class ProxyAuthenticator extends Authenticator {

    private String userName, password;

    public ProxyAuthenticator(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password.toCharArray());
    }
}
...
try {
    URL url = new URL(urlString);

    System.out.println("Reading..." + url);

    Authenticator.setDefault(new ProxyAuthenticator("username", "password");

    SocketAddress addr = new InetSocketAddress("proxy.server.com", 80);
    Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);

    HttpURLConnection conn = (HttpURLConnection)url.openConnection(proxy);

    ...