문제

저는 상품 정보를 위한 소규모 전문 검색 엔진을 구축 중입니다.엔진은 각 사이트에서 특정 데이터 세그먼트만 수집합니다.내 계획은 프로세스를 두 단계로 나누는 것입니다.

  1. 필요한 세그먼트가 존재하는 페이지를 가리키는 URL을 기반으로 한 간단한 화면 스크래핑입니다. 이를 수행하는 가장 쉬운 방법은 WebClient 객체를 사용하고 전체 HTML을 얻는 것입니까?

  2. HTML을 가져와 저장하면 일부 스크립트를 통해 이를 분석하고 필요한 세그먼트와 값(예: 제품의 가격 값)만 가져옵니다.내 문제는 이 스크립트가 내가 끌어오는 각 사이트에 대해 어떻게든 고유해야 하고, 정말 보기 흉한 HTML을 처리할 수 있어야 하고(그래서 XSLT는 할 수 없다고 생각합니다...) 변경할 수 있어야 한다는 것입니다. 대상 사이트가 업데이트되고 변경됨에 따라 즉석에서.마지막으로 특정 값을 가져와 데이터베이스에 기록하여 검색 가능하게 만듭니다.

최선의 방법을 설계하는 방법에 대한 몇 가지 힌트를 주시겠습니까?위에서 설명한 것과 다르게 하시겠습니까?

도움이 되었습니까?

해결책

  1. 예, WebClient가 이에 적합합니다.WebBrowser 컨트롤은 요구 사항에 따라 작동합니다.문서를 HtmlDocument(IE HTML DOM)로 로드하려는 경우 웹 브라우저 컨트롤을 사용하는 것이 더 쉬울 수 있습니다.

  2. 이제 .NET에 내장된 HtmlDocument 개체를 사용하여 HTML을 구문 분석할 수 있습니다.WebBrowser 컨트롤과 함께 사용하도록 설계되었지만 mshtml dll의 구현도 사용할 수 있습니다.나는 HtmlAgilityPack을 사용해 본 적이 없지만 비슷한 작업을 수행할 수 있다고 들었습니다.

HTML DOM 객체는 일반적으로 가장 보기 흉한 HTML을 처리하고 수정합니다.예를 들어 HTML을 구문 분석하는 더 좋은 방법을 허용할 뿐만 아니라 document.GetElementsByTag를 사용하여 태그 개체 컬렉션을 가져옵니다.

사이트의 변화하는 요구 사항을 처리하는 측면에서 보면 전략 패턴.리플렉션 등을 사용하여 각 사이트에 대한 전략을 로드할 수 있습니다.

나는 HTML 페이지에서 텍스트를 추출하기 위한 일반적인 매개변수 세트를 정의하기 위해 XML을 사용하는 시스템에 대해 작업했습니다.기본적으로 추출을 시작하고 종료하기 위해 시작 및 종료 요소를 정의합니다.나는 이 기술이 작은 샘플에는 충분히 잘 작동한다는 것을 알았지만 사이트 모음이 점점 더 커지면서 사용자 정의하기가 다소 번거롭고 어려워졌습니다.XML을 최신 상태로 유지하고 일반 XML 세트를 유지하고 모든 유형의 사이트를 처리하는 코드를 작성하는 것은 어렵습니다.그러나 사이트의 유형과 수가 적다면 이것이 효과가 있을 수 있습니다.

마지막으로 언급할 사항은 접근 방식에 정리 단계를 추가할 수 있다는 것입니다.프로세스에 들어갈 때 HTML을 정리하는 유연한 방법은 제가 과거에 작업했던 코드에서 매우 중요했습니다.아마도 다음 유형을 구현하는 것 같습니다. 관로 도메인이 이를 보장할 만큼 복잡하다고 생각한다면 좋은 접근 방식이 될 것입니다.그러나 구문 분석하기 전에 HTML에 대해 일부 정규식을 실행하는 방법조차도 가치가 있습니다.이미지 제거, 잘못 사용된 특정 태그를 더 좋은 HTML로 교체 등세상에 존재하는 정말 이상한 HTML의 양은 나를 계속 놀라게 합니다...

다른 팁

글쎄, 나는 당신이 설명하는 방식으로 갈 것입니다.

1.얼마나 많은 데이터를 처리할 예정인가요?WebClient/HttpWebRequest를 통해 전체 HTML을 가져오는 것은 문제가 되지 않습니다.

2.나는 갈 것이다 HtmlAgilityPack HTML 구문 분석을 위해.이는 매우 관대하며 꽤 보기 흉한 마크업도 처리할 수 있습니다.HtmlAgilityPack은 XPath를 지원하므로 개별 사이트에 대해 특정 xpath를 선택하는 것이 매우 쉽습니다.

나는 실행 중이며 최대한 빨리 이 답변을 확장할 예정입니다.

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