2011-12-08 2 views
1

이것은 대답이 명백한 바보 같은 질문 일 수 있습니다 ... 그러나 그것을 얻을 수 없습니다.페이지 소스보기 HTTPURLConnection

아래 그림과 같이 내가 자바 프로그램을 사용하여 웹 페이지 srouce을 읽으려고 오전 :

URL url = new URL(urlValue); 
HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
BufferedInputStream buffer = new BufferedInputStream(urlc.getInputStream()); 
StringBuilder builder = new StringBuilder(); 
byte[] by = new byte[1024]; 
int byteRead; 
while ((byteRead = buffer.read(by)) != -1){ 
    builder.append(new String(by, 0, byteRead)); 
} 
buffer.close(); 

모두 잘 작동, 나는 동일한 URL을 열 때 나는 페이지 소스 ... 를 볼 수 있습니다 브라우저에서 마우스 오른쪽 버튼으로 클릭하고 페이지 소스를 봅니다. 자바 프로그램의 페이지 소스가 브라우저에서 보는 것과 다릅니다.

이 이유를 알고 싶습니다. 내가 빠진 것이 있습니까? java 프로그램에서 정확히 동일한 결과를 얻으려면 어떻게해야합니까? 이르판

+1

어떤 차이가 있습니까? 보기 소스는 브라우저가 렌더링 과정에서 변경 한 내용을 보여주고 어떤 경우에는 스크립트로 DOM을 변경합니다. 예를 들어 IE는 속성 주위의 따옴표를 제거하고 대소 문자를 정규화합니다 ... –

답변

0

웹 사이트의 논리에 따라

덕분에, 당신의 응용 프로그램이 사용자 에이전트에 의해 필터링 할 수도 있습니다.

다른 "User-Agent"헤더를 넣으십시오.

올바른 페이지를 가져 오지 못하는 다른 이유는 리디렉션을 처리하지 않는다는 것입니다. 예를 들어 wsj.com을 열면 브라우저가 자동으로 online.wsj.com으로 리디렉션됩니다. 이러한 상황을 관리하려면이 기능이 구현 된 apache httpclient 라이브러리를 살펴보십시오.

+0

감사합니다 ... 확인해 보겠습니다. – irbash

0
  1. 내 페이지에는 다른 페이지에 대한 참조가 있다고 생각합니다. 브라우저가 이러한 참조로 자동으로 문서를 읽는 동안 수동으로 참조를 읽고 (또는 일부 프레임 워크를 사용하여) html을 구문 분석해야합니다.
  2. 웹 사이트 (urlValue)는 사용자가 사용자 에이전트로 로봇임을 인식하고 페이지의 내용을 반환하지 마십시오. tcpmon을 통해 연결을 확인하십시오.
+0

고마워요. 사용 도구를 설정하고 시도해 보겠습니다. – irbash

+0

htmlUnit을 사용하여 똑같은 것을 시도하고 있습니다 ... 나는 그와 같은 자바 프로그램과 비슷한 결과를 얻었습니다 ... – irbash

0

나는 이것을하지 않을 것이다.

builder.append(new String(by, 0, byteRead));

대신, ByteArrayOutputStream에 모든 바이트를 읽고 다음 문자열로 변환합니다.

UTF-8 또는 유사한 문자 세트의 경우 하나의 기호가 항상 1 바이트가되는 것은 아닙니다. 버퍼에 마지막으로 읽은 바이트는 멀티 바이트 문자의 일부일 수 있습니다. 문자열로 변환 할 때 마지막 문자가 완전하지 않으므로 문자열이 올바르지 않을 수 있습니다.

0
urlc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"); 

이 줄을 추가하면 문제가 해결됩니다. 나는이 영역에 대한 연구를하고 있으며, 아직이 주제에 대한 해결책을 찾지 못했지만 다양한 방법을 시도해 보았습니다.