2013-10-12 3 views
0

대략 5000 개의 다른 URL에 대해 HTML 소스 코드를 다운로드하기 위해 150 개의 스레드가있는 Apache HttpComponents를 사용하고 있습니다.Apache HttpComponents request.get.excute가 올바른 HTML 소스 코드를 반환하지 않습니다.

URL은 LinkedBlockingQueue에 있으며 가능한 경우 큐에서 SourceGetterThreads을 가져옵니다. 그런 다음 스레드는 EntityUtils.toString(HttpClient.execute().getEntity)을 사용하여 소스 코드를 다운로드하려고 시도합니다. HTML 소스 코드의 문자열 표현은 또 하나의 LinkedBlockingQueue에 놓이게됩니다. 여기에서 두 번째 대기열에서 가져 오는 소스 코드에서 유용한 작업을 수행 할 준비가 된 10 개의 스레드가 있습니다.

내 문제는 내가 소스 코드에서 수행중인 작업에서 오류를 발견했다는 점입니다. Matcher을 사용하여 특정 패턴을 일치시키고 발견 된 패턴을 기록합니다. 그러나 때로는 소스 코드가 잘못되어 URL과 일치하지 않습니다 (예 : 내 자바 메모리에 저장된 소스 코드가 Chrome 또는 FireFox에서 볼 때 소스 코드와 동일하지 않음). 이것은 무작위 적으로 보이기 때문에 때로는 소스 코드가 정확하고 때로는 그렇지 않습니다.

왜이 사람인지 아시겠습니까?

+0

: 여기에 예를 들어, 어떻게 User-Agent 값을 설정,이다. –

+0

나는 그것을 추상적으로 유지하려고 노력했고 너무 많은 것을 증명하지 않았다. 더 많은 정보를 요구하는 대신 부정적인 것에 감사드립니다. – james

+0

변경할 수 있습니다. –

답변

0

페이지를 가져 오는 사이트는 대부분 User-Agent과 같은 요청 헤더를 기반으로하는 일종의 요청 필터링을 수행합니다. 그래서 그들은 단순히 분석 result.There에 따라 서로 다른 내용을 반환 할 수 있습니다 그렇게 할 많은 이유가 있습니다 :

  1. 적절한 정보와 검색 로봇을 제공
  2. 사이트의 콘텐츠를 가져 오는로부터 웹 크롤러 거부는
  3. 모바일 장치를 인식 정기적 내용 대신 반환되는 스텁 오류 페이지를 일으키는 원인이 트리거 될 수 있습니다 집중적 같은 사이트 DOS 공격 보호의 어떤 종류를 조회하는 경우 및/다른 HTML/CSS와 JS
  4. 을 자신의 사용자를 제공

당신이 브라우저에서와 동일한 콘텐츠를 원하는 경우, 당신의 클라이언트에 대한 가장 기본적인 추천은 브라우저처럼 행동하는 것입니다

  1. 항상 User-Agent 헤더
  2. 따르 HTTP 리디렉션을 제공 (HTTP 코드 302, 303)를 필요한 경우
  3. 소스 코드 Y없이 HTTPS 방식

을 지원하기 위해 준비를 쿠키와 인증 루틴을 유지 아파치 HTTP 클라이언트를 사용하면 더 많은 것을 말할 수 있지만, 사용하고있는 아파치 HTTP 클라이언트는이 모든 것을 할 수 있습니다. 당신은 우리가 대답해야합니다 세부 정보의 양 근처에 어디에서 제공하지 않은

String url = "http://www.google.com/search?q=httpClient"; 
HttpClient client = new DefaultHttpClient(); 
HttpGet request = new HttpGet(url); 
request.addHeader("User-Agent","Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 
HttpResponse response = client.execute(request); 
+0

아플 수밖에 없지만 사용자 에이전트 헤더를 설정하는 방법에 대해 알고 계십니까? – james

+0

문제 없음) 코드 샘플에 대한 업데이트 된 답변을 참조하십시오. 그것은 HTTP 클라이언트 버전에 따라 달라질 수 있습니다. (내 코드는 4를 사용합니다.X) – Jk1

+0

대단히 감사합니다! – james

관련 문제