2013-03-23 3 views
0

내 응용 프로그램에서 웹 사이트를 구문 분석하고 ir에서 데이터를 데이터베이스로 저장해야합니다. HttpClient를 사용하여 페이지 내용을 가져 왔습니다. 내 코드는 다음과 같습니다 :잘못된 Java HttpClient 응답 스트림

 HttpClient client = new DefaultHttpClient(); 
     System.out.println(doc.getUrl()); 
     HttpGet contentGet= new HttpGet(siteUrl + personUrl); 
     HttpResponse response = client.execute(contentGet); 

     String html = convertStreamToString(response.getEntity().getContent()); 

     /* 
      parse the page 
     */ 

    /***********************************************************************/ 

    public static String convertStreamToString(InputStream is) throws Exception { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line + "\n"); 
    } 
    is.close(); 
    return sb.toString(); 
} 

루프에서이 작업을하고 있습니다 - 일부 페이지의 내용을 얻으려고합니다 (구조는 동일합니다). 때로는 잘 작동하지만 불행하게도, 많은 경우에 내 대답이 liek 유사한 쓰레기의 순서입니다 : 문제입니다

�=�v7���9�Hdz$�d7/�$�st��؎I��X^�$A6t_D���!gr�����C^��[email protected]��MQ�2�d�8�] 

내가 나도 몰라, 저를 도와주세요.


나는 모든 응답의 헤더를 표시했습니다. 올바른 사람을 위해,이 있습니다 : 잘못된 것들에 대한

Server : nginx/1.0.13 
Date : Sat, 23 Mar 2013 21:50:31 GMT 
Content-Type : text/html; charset=utf-8 
Transfer-Encoding : chunked 
Connection : close 
Vary : Accept-Encoding 
Expires : Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control : no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma : no-cache 
Set-Cookie : pfSC=1; path=/; domain=.profeo.pl 
Set-Cookie : pfSCvp=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.profeo.pl 

:

Server : nginx/1.2.4 
Date : Sat, 23 Mar 2013 21:50:33 GMT 
Content-Type : text/html 
Transfer-Encoding : chunked 
Connection : close 
Set-Cookie : pfSCvp=3cff2422fd8f9b6e57e858d3883f4eaf; path=/; domain=.profeo.pl 
Content-Encoding : gzip 

다른 제안? 내 생각 엔이 gzip 인코딩은 여기에있는 문제이지만, 어떻게해야할까요?

답변

2

이것은 아마도 일부 웹 사이트가 JVM 기본값보다 응답에 다른 문자 인코딩을 사용하는 것과 관련이 있습니다. InputStreams가 제공하는 것과 같은 원시 바이트 스트림을 문자 스트림 (또는 문자열)으로 변환하려면 문자 인코딩을 선택해야합니다. HTTP 응답은 다른 인코딩을 사용할 수 있지만 일반적으로 사용중인 인코딩을 알려줍니다. HttpResponse의 "Content-Encoding"헤더를 찾아 수동으로이 작업을 수행 할 수 있지만 일반적으로 필요하기 때문에 라이브러리는이를 수행하는 유틸리티를 제공합니다. EntityUtils 클래스에있는, 그리고 당신이 그렇게 좋아 사용할 수 있습니다

String html = EntityUtils.toString(response.getEntity()); 

당신은 그 일을 할 파일의 상단에

import org.apache.http.util.EntityUtils; 

를 추가해야합니다.

도움이되지 않는 경우 검색하는 URL 중 일부가 텍스트가 아닌 바이너리 인 경우가 있습니다.이 경우 사용자가하려는 작업이 의미가 없습니다. 그런 경우에는, 당신은 아마도과 같이, Content-Type 헤더를 확인하여 텍스트 응답 및 바이너리 응답 구분하는 시도 할 수 있습니다 :

boolean isTextual = response.getFirstHeader("Content-Type").getValue().startsWith("text"); 

NEW MATERIAL :

당신이 추가 HTTP 헤더를보고 한 후 귀하의 질문, 내 최고의 추측이 응답의 gzip 압축에 의해 발생하는 것입니다. this question에서 그 문제를 처리하는 방법에 대한 자세한 정보를 찾을 수 있지만 짧은 버전은 DefaultHttpClient 대신 ContentEncodingHttpClient을 사용해야한다는 것입니다.

다른 편집 : ContentEncodingHttpClient가 이제 비추천이며, 대신 DecompressingHttpClient을 사용해야합니다.

+0

나는 당신이 제안한 20 개의 유사한 페이지에 대해 EntityUtils를 사용했다. isTextual 변수의 값도 표시했습니다.20 페이지 중 2 페이지는 올바른 HTML이었고 다른 18 페이지는 다시 휴지통으로 받았습니다. 그들 모두에 대해 isTextual의 값은 참이었습니다. 예를 들어 - 페이지 http://profeo.pl/piotr-grzes가 성공적으로 수신되었고 http://profeo.pl/annais가 수신되지 않았습니다. 무엇이 잘못되었는지 전혀 모르겠다.이 페이지는 사실상 동일하다. – user1315305

+0

첫 번째 게시물에 새로운 정보를 추가했습니다. – user1315305

+0

정말 고마워요! 나는 그것을 이해하려고 노력하는 데 많은 시간을 보냈다. 이제는 마침내 작동한다! – user1315305

0

압축을 사용하지 않는 httpclient가 필요합니다. 나는 이것을 사용한다 HttpClientBuilder.create().disableContentCompression().build() httpclient