2016-07-14 1 views
1

최근에 웹 크롤러를 부 프로젝트로 작성했습니다. 구조화 된 방식은 System.Net.WebClientDownloadString 함수를 사용하여 지정된 주소 HTML을 다운로드 한 다음 모든 문자열 처리를 수행합니다. html에 포함 된 링크를 찾은 다음 찾은 모든 링크에서 프로세스를 반복합니다 (이미 크롤링 된 항목은 건너 뜁니다).WebClient.DownloadString이 횡설수설하고 있습니다.

그것은 대부분의 주소에 대해 잘 작동하지만 씨앗으로 www.yahoo.com 그것을 시작할 때 매우 이상한 일을한다. 대신 다시 DownloadString에서 HTML 태그를 얻는 것이 횡설수설의 무리를 다시지고 호출합니다.

는 는 는

은 기본적으로 당신이 무엇을보고 돌려 줄 것이라고 당신이 웹 페이지에 view page source하지만 브라우저에서 www.yahoo.com에 그렇게 할 때이 HTML을 볼 수 있기 때문에이 경우 수 없습니다 예상 DownloadString 기능의 나의 이해가 될 때 때 .

매우 짧은 시일 내에 생각해 보면 내 초기 생각은 문자열이 디코딩에 사용 된 것과 다른 인코더로 인코딩 된 것처럼 보였지만 사용하려고하는 인코딩을 수동으로 설정하는 방법이 표시되지 않습니다. System.Net.WebClient 클래스를 통해 문자열을 다운로드하십시오.

이것은 내가받은 텍스트의 일부입니다 :

‹Ä½y“£FÖ7úÿó)4í™ûQ«Ä.è;^´ïû~ûvH€Ö ÷›€ÈL©ªì‰{­» gÉ“'OîÉ¿ÿQî•Æ‹~%cûÿùwøŸŒ¥þþEÜ¥|ÉØ’cüþEsr“Ñ—ŒbK¾KËlδâÚûãg윻2}×Ïy€S°õ3úü/w 2žB†©š.íí ³±+·7s®“9XÚQórže˜AƼŒªùëÀÝfÊ×ÿÊë€" µdÙ¾¤k_2~p¶µß¿È

www.yahoo.com에서 HTML을 당길 때 뭔가 잘못을하고있는 중이 야한다면 내 첫 질문은 누구나 알고 있나요입니까? 그리고 그렇다면, html을 가져와야하는 또 다른 방법이 있습니까? 다음 질문은 디자인에 의한 것이라면 어떻게 이것을 달성할까요? 그리고 왜 그들은 그것을 뒤섞을 것입니까? 경쟁 업체가 웹 사이트를 크롤링하지 못하게하려고합니까?

답변

2

야후는 사용자 에이전트에 대한 특정 것 같다. 적절한 평문 응답을 얻으려면 이것을 지정할 수 있습니다.

Using webRequest As WebClient = New WebClient 
     webRequest.Headers(HttpRequestHeader.UserAgent) = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)" 
     Dim url As String = "http://www.yahoo.com" 
     Dim webPage As String = webRequest.DownloadString(url) 
     Debug.WriteLine(webPage) 
    End Using 
+1

"테스트"조차도 모든 사용자 에이전트가 작동하기 때문에 헤더 값이 있어야합니다. – Esko

+1

그 트릭을 했어. 나는 그것을 확인하기 위해 결코 생각하지 않았을 것이다, 고마워! –

+0

문제 없음 - 도움이 되니 기쁩니다. –

관련 문제