문제

사용 가능한 웹 서비스 API가 없는 경우 유일한 옵션은 Screen Scrape일 수 있지만 C#에서는 어떻게 수행합니까?

어떻게 할 생각이야?

도움이 되었습니까?

해결책

Matt와 Paul의 대답은 정확합니다. 웹 사이트에서 HTML을 구문 분석하여 "스크래핑"은 일반적으로 나쁜 생각입니다.

  1. HTML을 구문 분석하는 것은 어려울 수 있습니다, 특히 기름기가 많은 경우. 매우 간단한 페이지를 긁어 내고 있다면 정규 표현이 효과가있을 수 있습니다. 그렇지 않으면 HTML 민첩성 팩과 같은 구문 분석 프레임 워크를 사용하십시오.

  2. 웹 사이트는 움직이는 대상입니다. 소스 웹 사이트가 마크 업 구조를 변경할 때마다 코드를 업데이트해야합니다.

  3. 스크린 스크래핑은 JavaScript에서 잘 작동하지 않습니다. 대상 웹 사이트가 모든 종류의 동적 스크립트를 사용하여 웹 페이지를 조작하는 경우 웹 페이지를 조작 할 수 있습니다. HTTP 응답을 쉽게 잡을 수 있습니다. 해당 응답에 포함 된 클라이언트 측 스크립트에 대한 응답으로 브라우저가 표시하는 내용을 긁어내는 것이 훨씬 어렵습니다.

스크린 스크래핑이 유일한 옵션 인 경우 성공의 열쇠가 있습니다.

  1. 원하는 패턴을 변경할 수 있도록 최대한 쉽게 만드십시오.. 가능하면 패턴을 텍스트 파일 또는 어딘가에 리소스 파일로 저장하십시오. 다른 개발자 (또는 3 개월 안에 자신)가 어떤 마크 업을 찾을 수 있는지 이해하기 쉽습니다.

  2. 입력을 검증하고 의미있는 예외를 던집니다. 구문 분석 코드에서 예외를 매우 도움이되도록주의하십시오. 대상 사이트 ~ 할 것이다 당신을 변경하고 그 일이 발생하면 오류 메시지가 실패했을뿐만 아니라 어떤 부분이 실패했는지 알려주기를 원합니다. 실패했습니다. 찾고있는 패턴과 비교하는 텍스트를 모두 언급하십시오.

  3. 자동 테스트를 많이 작성하십시오. 당신은 비파괴적인 방식으로 스크레이퍼를 실행하는 것이 매우 쉽기를 원합니다. ~ 할 것이다 패턴을 올바르게 얻기 위해 반복적 인 개발을 많이하고 있습니다. 가능한 한 많은 테스트를 자동화하면 장기적으로 돈을 지불합니다.

  4. 브라우저 자동화 도구를 고려하십시오 처럼 Watin. 대상 웹 사이트와의 복잡한 상호 작용이 필요한 경우 HTTP 요청 및 응답을 직접 사용하는 대신 브라우저 자체의 관점에서 스크레이퍼를 작성하는 것이 더 쉬울 수 있습니다.

에 관해서 어떻게 C#에서 스크랩을 스크랩하려면 Watin (위 참조)을 사용하고 DOM을 사용하여 결과 문서를 긁거나 사용할 수 있습니다. WebClient 클래스 [MSDN 또는 Google 참조] HTML 컨텐츠를 포함하여 원시 HTTP 응답을받은 다음 원하는 데이터를 추출하기 위해 일종의 텍스트 기반 분석을 사용하십시오.

다른 팁

사용 HTML 민첩성 팩.잘못되고 잘못된 형식의 HTML을 처리합니다.XPath로 쿼리할 수 있으므로 원하는 데이터를 매우 쉽게 찾을 수 있습니다.파서를 직접 작성하지 말고 정규식을 사용하지 마십시오. 너무 서투릅니다.

당신이 찾고있는 용어는 실제로 호출됩니다 화면 스크래핑.

웹 사이트를 긁어내는 것에 대해 고려해야 할 한 가지는 귀하가 통제 할 수 없으며 자주 그리고 크게 변할 수 있다는 것입니다. 당신이 변화의 사실을 긁어 내고 있다면, 당신의 전반적인 전략의 일부에 참여해야합니다. 예를 들어 "이동 목표"를 처리하려면 조만간 코드를 업데이트해야합니다.

다음은 시작하기위한 몇 가지 C# 링크입니다.

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/how-to-scrape-or-download-a-webpage-using-csharp.aspx

다음은 도움이되는 샘플 C# 코드입니다.

Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
    //Create Request Object
    HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    //Set Request Method
    objRequest.Method = WebRequestMethods.Http.Get;
    //Get response from requested url
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    //Read response in stream reader
    StreamReader reader = new StreamReader(objResponse.GetResponseStream());
    string tmp = reader.ReadToEnd();
    objResponse.Close();
    //Set response data to container
    this.pnlScreen.GroupingText = tmp;
}

주목할만한 한 가지, 몇몇 사람들은 웹 사이트를 XML로 끌어 내고 XPath를 사용하여 노드를 반복하는 것을 언급했습니다. HTML이 잘 형성된 XML 문서를 나타내는지 확인하기 위해 XHTML에서 개발 된 사이트를 사용하는 것이 중요합니다.

실용적인 관점에서 (수년에 걸쳐 수십 개의 "웹 인터랙티브"앱을 썼습니다) 마침내 나는 Watin 결합 csquery.

Watin은 브라우저 자동화 (버튼 등과 상호 작용)의 기본 사항을 제공하는 반면 CSQuery를 사용하면 jQuery Style Syntax를 사용하여 페이지 컨텐츠를 구문 분석 할 수 있습니다.

IE 및 Firefox와 함께 한동안 셀레늄을 사용했지만 장기 스크래핑에 사용될 때 충돌이 발생하기 쉬운 것으로 나타났습니다. 현재의 모든 생산 시스템은 Watin + CSQuery이며 매일 여러 웹 사이트를 신뢰할 수있는 스크래핑을 제공합니다.

참고 : Watin이 한동안 업데이트되지 않았다는 것을 알고 있지만 "부러지지 않으면 사용하십시오!" :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top