2012-02-03 3 views
17

크롤러를 만들고 있으며 스트림이 200인지 여부에 관계없이 스트림에서 데이터를 가져와야합니다. CURL은 표준 브라우저뿐 아니라 모든 것을 수행하고 있습니다.URLConnection에서 HTTP 오류 (404,500 등)가있는 데이터에 액세스 할 수 없습니다.

다음은 HTTP 오류 상태 코드와 함께 예외가 발생하는 경우에도 실제로 요청의 내용을 가져 오지 않습니다. 나는 출력을 관계없이 원한다, 거기 방법 있는가? 이 라이브러리는 실제로 지속적 연결을 수행하므로 크롤링 유형에 이상적입니다. 간단한

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); 
    } 
} 

답변

37

: 당신은 설명 Javadoc을 참조 할 수 있습니다

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(); 
    } 
} 

- 단지 개념의 거친 증거로 여기에 내가 무엇을 최대 온 것입니다 :

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); 
     } 
    } 
} 

는 감사, 근무 . 당신은 openConnection를 호출 한 후 다음을 수행 할 필요가

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(); 
     } 
    } 
} 
+0

"InputStream is = connection.getResponseMessage();" URLConnection 클래스에서 getResponseMessage 메소드가 표시되지 않습니다.이 메소드는 HttpUrlConnection의 일부이므로, 타입 변환하지 않아야합니까? 아니면 getResponseMessage를 getInputStream으로 대체 할 수 있습니까? 그렇지 않으면 예외가 발생합니까? – David

+0

오타였습니다. 그것은'connection.getInputStream()'입니다. –

+0

아주 좋은 짧은 대답 –

8

다음과 같이 내가 이것을 처리 할 수있는 가장 좋은 방법입니다.

  1. 응답이 성공하면 HttpURLConnection의

  2. 전화 getResponseCode

  3. 에 URLConnection의 캐스트,는 getInputStream을 사용, 그렇지 않으면 성공을 위해 getErrorStream

(테스트를 사용해야합니다 유효한 HTTP 성공 코드가 200 개 이상 떨어져 있기 때문에 200 <= code < 300이됩니다.


나는 크롤러를 만들고, 그것이 200인지 아닌지에 관계없이 스트림에서 데이터를 얻을 필요가 있어요.

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


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