[java] URLConnection에서 HTTP 오류 (404,500 등)에 대한 데이터에 액세스 할 수 없습니다.


0 Answers

openConnection 을 호출 한 후 다음을 수행해야합니다.

  1. URLConnection을 HttpURLConnection에 캐스트합니다.

  2. getResponseCode를 호출합니다.

  3. 응답이 성공하면 getInputStream을 사용하고, 그렇지 않으면 getErrorStream을 사용하십시오.

( 200 <= code < 300 이외의 유효한 HTTP 성공 코드가 있기 때문에 성공 테스트는 200 <= code < 300 이어야합니다.)

크롤러를 만들고 있으며 스트림이 200인지 여부에 관계없이 스트림에서 데이터를 가져와야합니다.

코드가 4xx 또는 5xx 인 경우 "데이터"는 일종의 오류 페이지 일 가능성이 높습니다.

마지막으로해야 할 점은 "robots.txt"파일을 항상 존중하고 소유자 관심을 가질만한 사이트의 콘텐츠를 크롤링 / 스크랩하기 전에 서비스 약관을 읽어야한다는 것입니다. GET 요청을 무시하는 것만으로도 사이트 소유자를 괴롭 히게 될 것입니다. 이미 그들과 "일종의"계약을하지 않았다면 말입니다.

Question

크롤러를 만들고 있으며 스트림이 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);
    }
}



Related