web-dev-qa-db-ja.com

URLConnectionでは、HTTPエラー(404、500など)に関するデータにアクセスできません

クローラーを作成しています。200かどうかに関係なく、ストリームからデータを取得する必要があります。 CURLは標準のブラウザと同様にそれを行っています。

次のものは実際にはリクエストのコンテンツを取得しませんが、いくつかはありますが、httpエラーステータスコードで例外がスローされます。関係なく出力が必要ですが、方法はありますか?このライブラリは永続的な接続を実際に行うため、このライブラリを使用することを好みます。これは、実行しているクロールの種類に最適です。

package test;

import Java.net.*;
import Java.io.*;

public class Test {

    public static void main(String[] args) {

         try {

            URL url = new URL("http://github.com/XXXXXXXXXXXXXX");
            URLConnection connection = url.openConnection();

            DataInputStream inStream = new DataInputStream(connection.getInputStream());
            String inputLine;

            while ((inputLine = inStream.readLine()) != null) {
                System.out.println(inputLine);
            }
            inStream.close();
        } catch (MalformedURLException me) {
            System.err.println("MalformedURLException: " + me);
        } catch (IOException ioe) {
            System.err.println("IOException: " + ioe);
        }
    }
}

うまくいきました、ありがとう:これは私が思いついたものです-概念の大まかな証明として:

import Java.net.*;
import Java.io.*;

public class Test {

    public static void main(String[] args) {
//InputStream error = ((HttpURLConnection) connection).getErrorStream();

        URL url = null;
        URLConnection connection = null;
        String inputLine = "";

        try {

            url = new URL("http://verelo.com/asdfrwdfgdg");
            connection = url.openConnection();

            DataInputStream inStream = new DataInputStream(connection.getInputStream());

            while ((inputLine = inStream.readLine()) != null) {
                System.out.println(inputLine);
            }
            inStream.close();
        } catch (MalformedURLException me) {
            System.err.println("MalformedURLException: " + me);
        } catch (IOException ioe) {
            System.err.println("IOException: " + ioe);

            InputStream error = ((HttpURLConnection) connection).getErrorStream();

            try {
                int data = error.read();
                while (data != -1) {
                    //do something with data...
                    //System.out.println(data);
                    inputLine = inputLine + (char)data;
                    data = error.read();
                    //inputLine = inputLine + (char)data;
                }
                error.close();
            } catch (Exception ex) {
                try {
                    if (error != null) {
                        error.close();
                    }
                } catch (Exception e) {

                }
            }
        }

        System.out.println(inputLine);
    }
}
22
MichaelICE

シンプル:

URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
if (connection instanceof HttpURLConnection) {
   HttpURLConnection httpConn = (HttpURLConnection) connection;
   int statusCode = httpConn.getResponseCode();
   if (statusCode != 200 /* or statusCode >= 200 && statusCode < 300 */) {
     is = httpConn.getErrorStream();
   }
}

説明については、Javadocを参照してください。これを処理する最良の方法は次のとおりです。

URLConnection connection = url.openConnection();
InputStream is = null;
try {
    is = connection.getInputStream();
} catch (IOException ioe) {
    if (connection instanceof HttpURLConnection) {
        HttpURLConnection httpConn = (HttpURLConnection) connection;
        int statusCode = httpConn.getResponseCode();
        if (statusCode != 200) {
            is = httpConn.getErrorStream();
        }
    }
}
46
Buhake Sindi

openConnectionを呼び出した後、次のことを行う必要があります。

  1. URLConnectionをHttpURLConnectionにキャストします

  2. GetResponseCodeを呼び出す

  3. 応答が成功した場合はgetInputStreamを使用し、それ以外の場合はgetErrorStreamを使用します

(成功のテストは200 <= code < 300有効なHTTP成功コードが200以外にあるためです。)


クローラーを作成しています。200かどうかに関係なく、ストリームからデータを取得する必要があります。

コードが4xxまたは5xxの場合、「データ」は何らかのエラーページである可能性があることに注意してください。


最後に、「robots.txt」ファイルを尊重し、利用規約を読んでから、所有者のサイトのコンテンツをクロール/スクレイピングしてください可能性がありますケア。 GETリクエストを単純に打ち消すと、サイトの所有者を困らせる可能性があります。

11
Stephen C