.NET의 Amazon에서 제품 정보 추출 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

.NET의 Amazon에서 제품 정보 추출

페이지 정보

작성자 GrapeCity 작성일 21-08-13 14:30 조회 1,884회 댓글 0건

본문

첨부파일

전자 상거래는 수년에 걸쳐 엄청나게 성장한 산업입니다. 사용자는 많은 전자 상거래 플랫폼에서 거의 모든 것을 구입할 수 있습니다. 다양한 옵션으로 고객 만족도가 높아지고 있는 반면, 또 다른 중요한 요소인 데이터도 기하급수적으로 증가하고 있습니다.


이러한 전자 상거래 사이트는 사용 가능한 제품, 가격, 제품 구입 정보, 등급, 고객 리뷰 등 수많은 데이터를 포함합니다. 이 데이터의 수집과 분석은 전자 상거래 경쟁업체, 제품 비교 포털, 시장 조사 업체 등이 성공에 중요한 역할을 할 수 있습니다. 이 데이터를 어떻게 수집할 수 있을까요?


이를 수행하는 가장 간단한 방법은 수동 수집을 사용하는 것입니다. 페이지를 방문하여 필요한 정보(excel 파일 등)를 메모한 다음 다른 페이지에 동일한 작업을 반복할 수 있습니다. 이는 분명히 번거롭고 실현 가능한 솔루션이 아닙니다.


이 블로그에서는 amazon.com과 함께 C1TextParser 라이브러리를 예로 들어 전자상거래 사이트에서 데이터를 추출하는 쉬운 솔루션을 만드는 방법을 살펴봅니다. C1TextParser는 이메일, 웹 페이지, 텍스트 파일 등 다양한 반정형 소스에서 정형화 형식으로 데이터를 추출할 수 있는 .NET 표준 라이브러리입니다.


amazon



C1TextParser 설치

C1TextParser를 설치하는 가장 간단한 방법은 NuGet를 사용하는 것입니다. "C1.TextParser" 패키지를 검색하여 동일한 패키지를 설치합니다.


c1 text parser


C1TextParser는 ComponentOne 제어판의 서비스 컴포넌트 타일을 통해 다운로드 및 설치할 수도 있습니다. 이 설치 프로그램에서 다운로드하면 샘플 및 기타 컴포넌트에 액세스할 수도 있습니다.



HTML 추출기 정의

C1TextParser는 Starts-After-Continues-Until, HTMLTemplate-based 3가지 추출기를 제공합니다. 이 블로그에서는 HtmlExtractor로 설명합니다.


Html Extractor를 만들고 사용하려면 주로 다음 세 가지가 필요합니다.

  1. 템플릿 스트림: 템플릿으로 사용할 HTML 콘텐츠를 나타내는 스트림입니다. 자리 표시자는 이와 관련하여 선언됩니다.

  2. 자리 표시자: 데이터를 추출해야 하는 HTML 요소에 XPath를 제공합니다. 수정/반복할 수 있습니다.

  3. 입력 스트림: 데이터를 추출해야 하는 페이지로의 텍스트 스트림입니다.


예를 들어 amazon.com에서 제품의 가격 정보를 추출하기 위한 템플릿으로 사용되는 웹 페이지의 일부를 볼 수 있습니다.

html 추출


그리고 다음 코드는 웹 페이지에서 이 정보를 추출하도록 HtmlExtractor를 설정 방법을 보여줍니다.

var response = await Client.GetAsync(productUri);
var page = await response.Content.ReadAsStreamAsync();
var extractor = new HtmlExtractor(page);
extractor.AddPlaceHolder("price", @"//*[@id=""priceblock_ourprice""]");
var extractionResult = extractor.Extract(page);
var json = extractionResult.ToJsonString();


웹 페이지에서 제품 이름, 평점 등의 데이터를 추출하려면 AddPlaceHolder 메서드를 사용하여 더 많은 자리 표시자를 추가한 다음 추출을 수행하여 원하는 결과를 얻을 수 있습니다. 그러나 다음 섹션에서 볼 수 있듯이 이는 완전한 솔루션이 아닙니다.



XPathPool

위에 나와 있는 접근 방식은 모든 웹 페이지가 정의된 템플릿과 동일한 구조, 즉 모든 웹 페이지의 웹 요소가 템플릿 자리 표시자에 의해 정의된 것과 동일한 XPath에 있는 경우 완벽하게 작동합니다.


그러나 최신 전자 상거래 사이트에서는 이를 보장할 수 없습니다. 이러한 사이트에서는 요소의 위치가 기본적으로 동적으로 지정됩니다. 자리 표시자 요소 앞에 항상 추가 HTML 행이 있을 수 있으므로 자리 표시자의 XPath가 유효하지 않게 됩니다.


xpathpool


자리 표시자의 XPath를 동적으로 정의하여 이 문제를 해결할 수 있습니다. XPath의 동적 선택을 지원하기 위해 이 블로그에 XPathPool 개념을 소개합니다.


XPathPool은 이름에서 알 수 있듯이 여러 웹 페이지에서 수집된 XPath 풀입니다.

xpathpool


다음은 IXPathPool 인터페이스를 보여 줍니다.

public interface IXPathPool
{
    IEnumerable<XPathObject> GetBestMatchingXPaths(string html);
    void AddXPathToPool(XPathObject xPathObj);
    void AddXPathsToPool(IEnumerable<XPathObject> xPathObjs);
    void Clear();
}


이는 위의 xpath가 풀에 추가되는 방법을 보여줍니다.

var _xpathPool = new XPathPool();
_xpathPool.AddXPathToPool(new XPathObject("ProductColor", @"//*[@id=""poExpander""]/div[1]/div/table/tbody/tr[1]/td[2]/span"));
_xpathPool.AddXPathToPool(new XPathObject("ProductColor", @"//*[@id=""productOverview_feature_div""]/div/table/tbody/tr[4]/td[2]/span"));


다음으로 일부 유효성 검사를 통해 XPath Pool이 자리 표시자를 동적으로 정의할 수 있는 가장 적합한 XPath를 선택하는 방법에 대해 살펴보겠습니다.



XPathObject 및 XPathMatchValidator


관찰해보면 추출할 데이터는 항상 데이터의 내용을 알려주는 식별자 텍스트가 있습니다. 예를 들어 아래 페이지의 '색상' 텍스트는 인접한 텍스트가 제품의 색상을 제공함을 나타냅니다.

xpathobject


따라서 XPath Pool을 구성하는 모든 XPath에 대해 다음 정보가 저장됩니다.

  1. 데이터가 포함된 웹 요소의 XPath

  2. 템플릿 자리 표시자에서 위의 XPath에 사용할 이름

  3. 식별자

    1. 식별자를 포함하는 웹 요소의 XPath

    2. 식별자 XPath가 포함할 수 있는 가능한 텍스트 값

      public class XPathMatchValidator : BaseXPathObject
      {
        public IEnumerable<string> ItemsSource { get; private set; }
      ​
        public XPathMatchValidator(string xPath, string validatorText)
        {
            XPath = xPath;
            ItemsSource = new List<string> { validatorText};
        }
      ​
        public bool Validate(HtmlDocument doc)
        {
            HtmlNode node = doc.DocumentNode.SelectSingleNode(XPath);
      ​
            if (node == null)
                return false;
            var innerText = node.InnerText.Trim(' ', ':');
            return ItemsSource.Contains(innerText);
        }
      }
      public class XPathObject : BaseXPathObject
      {      
            public XPathMatchValidator Validator { get; private set; }
            public bool HasValidator => Validator != null;
      }

XPathMatchValidator를 사용하면 XPathPool 초기화가 다음과 같이 변경됩니다.

var _xpathPool = new XPathPool();
var xPathObj1 = new XPathObject("ProductColor", @"//*[@id=""poExpander""]/div[1]/div/table/tbody/tr[1]/td[2]/span")
{
  Validator = new XPathMatchValidator(@"//*[@id=""poExpander""]/div[1]/div/table/tbody/tr[1]/td[1]/span", "Color")
};
​
var xPathObj2 = new XPathObject("ProductColor", @"//*[@id=""productOverview_feature_div""]/div/table/tbody/tr[4]/td[2]/span")
{
  Validator = new XPathMatchValidator(@"//*[@id=""productOverview_feature_div""]/div/table/tbody/tr[4]/td[1]/span", "Color")
};
_xpathPool.AddXPathToPool(xPathObj1);
_xpathPool.AddXPathToPool(xPathObj2);

다음 코드는 XPathPool이 위의 요소를 사용하여 유효성 검사기를 사용해 동적으로 XPath를 선택하는 방법을 보여줍니다.

public IEnumerable<XPathObject> GetBestMatchingXPaths(string html)
{
  HtmlDocument doc = new HtmlDocument();
  doc.LoadHtml(html);
​
  foreach (var pair in _xPaths)
  {
      foreach (var xPathObj in pair.Value)
      {
          if (!xPathObj.HasValidator && doc.IsValidXPath(xPathObj.XPath))
          {
              yield return xPathObj;
              break;
          }
​
          if (xPathObj.HasValidator && xPathObj.Validator.Validate(doc))
          {
              yield return xPathObj;
              break;
          }
      }
  }
​
  doc.DocumentNode.ChildNodes.Clear();
}



모두 합치기

이제 모든 어려운 작업이 완료되었으므로 HtmlExtractor를 정의하는 것은 다음과 같이 간단합니다.

var xPathObjects = _xPathPool.GetBestMatchingXPaths(html);
var stream = new MemoryStream(Encoding.ASCII.GetBytes(html));
var extractor = new HtmlExtractor(stream);
foreach(var xPath in xPathObjects)
{
extractor.AddPlaceHolder(xPath.Name, xPath.XPath);
}
var result = extractor.Extract(actualPage);


데모


위 샘플의 전체 코드는 이 문서의 끝에서 찾을 수 있습니다. 제품 문서에서 TextParser에 대해 자세히 알아볼 수 있습니다.


여기에서 HtmlParsingDemo 샘플을 다운로드하세요.




지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!

c1.png

 
  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2022 GrapeCity inc.