NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    커스텀 [고급 사용자] 2. 네이버에서 비트코인 관련 뉴스 크롤링 및 엑셀 저장하기. (Crawling Bitcoin-related …

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 커스텀 모듈 개발 환경을 갖추기 위한 [ 이전 글 ]을 먼저 읽어보시고 이글을 읽어야 합니다. 자~ 이제 개발 환경이 갖춰진 상태에서 아래와 같이 코드를 추가해보세요. 소스 코드에 주석을 달아두었으니 이해하는데 크게 어려움은 없을겁니다. 그래도, 중요한 몇가지는 아래에서 하나씩 알아볼께요^^

    using OpenQA.Selenium;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    
    namespace CustomNaverNewsCrawler
    {
        [Serializable]
        public class NaverNewsCrawlerModel : NGM.Models.Interface.BaseCustomToolModel
        {
            /// <summary>
            /// 도구 상자에 표시될 카테고리 이름을 가져옵니다.
            /// </summary>
            public override string DisplayCategory => "웹크롤러";
    
            /// <summary>
            /// 도구 상자에 표시될 액션 이름을 가져옵니다.
            /// </summary>
            public override string DisplayName => "네이버뉴스 크롤링";
    
            /// <summary>
            /// 셀레니움 웹드라이브와 연결된 액션의 이름을 가져오거나 설정합니다.
            /// </summary>
            [Category("Action")]
            [DisplayName("웹사이트 이름")]
            [Description("웹에 연결하는 웹사이트의 이름을 선택합니다.")]
            [Browsable(true)]
            [DefaultValue(null)]
            [TypeConverter(typeof(NGM.Models.TypeConverter.WebSiteIDConverter))]
            public string WebSiteName { get; set; }
    
            public override void Execute()
            {
                // 크롤링한 뉴스 기사와 링크를 엑셀로 저장하는 위치입니다.
                // Environment를 사용하면 다이나믹하게 대응할 수 있는 시스템 폴더를 가져올 수 있습니다.
                string fullPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "News.csv");
    
                // 엔지엠 에디터의 웹 API를 사용할 때 연결된 사이트를 가져옵니다.
                // 이 부분은 http://ngmsoftware.com/bbs/board.php?bo_table=ngm5&wr_id=146 를 참고하세요.
                IWebDriver driver = base.MainView.CurrentScriptView.Player.WebDriver[this.WebSiteName];
    
                // 네이버뉴스를 표시하는 그룹 노드를 가져옵니다.
                IWebElement newsRootElement = driver.FindElement(By.XPath(@"//*[@id='main_pack']/section/div/div[3]/ul"));
    
                // 그룹안에는 각각의 뉴스들이 포함되어 있습니다. 각각의 페이지에는 10개의 뉴스가 표시됩니다.
                List<IWebElement> news = newsRootElement.FindElements(By.ClassName("bx")).ToList();
    
                string contents = string.Empty;
    
                // 10개의 뉴스를 반복하면서 탐색하고, 뉴스 제목과 링크를 만듭니다.
                foreach (IWebElement n in news)
                {
                    IWebElement link = n.FindElement(By.ClassName("news_tit"));
    
                    // 뉴스 제목에 CSV 파일의 세퍼레이터(Seperator, 구분자)가 포함되어 있는 경우 처리하는 로직입니다.
                    contents += $"{link.Text.Replace(",", " ")},{link.GetAttribute("href")}{Environment.NewLine}";
                }
    
                // 네이버뉴스에서 크롤링한 내용들을 엑셀 파일(CSV)로 저장합니다.
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(fullPath, false, Encoding.UTF8))
                {
                    file.WriteLine("제목,링크");
                    file.Write(contents);
                }
            }
        }
    }

     

    첫번째 라인의 Serializable(시리얼라이저블, 직렬화 가능)은 엔지엠 에디터의 액션으로 직렬화하여 저장할 수 있게 해줍니다. 이는 클래스의 고유한 Attribute(어트리뷰트, 특성)를 나타냅니다. 이 특성이 없으면 엔지엠 에디터에 액션을 추가하고 동작은 되지만, 저장할 수 없게됩니다. 그러니 꼭~!!! 이 특성을 모델에 부여해야 합니다.

        [Serializable]
        public class NaverNewsCrawlerModel : NGM.Models.Interface.BaseCustomToolModel

     

    두번째 라인에 보면 클래스 옆에 "NGM.Models.Interface.BaseCustomToolModel"이 상속되어 있는걸 알 수 있습니다. 이 클래스는 추상 클래스(Abstract, 앱스트랙트)로 상속 받은 자식 클래스가 인터페이스를 따르도록 강제할 수 있습니다. 비주얼 스튜디오는 추상화와 인터페이스를 자동으로 구현해줍니다. 물론, 적절하게 수정해야 하죠. [ 추상화 ]에 대한 내용은 한번씩 읽어보시면 도움이 될겁니다. 다형성은 [ OOP의 중요한 개념 ]입니다. 다형성을 적용하려면 추상화와 인터페이스는 필수예요^^;

     

    아래와같이 커스텀 모듈을 개발할 수 있는 추상 클래스와 인터페이스를 제공하고 있습니다. 

    T45Cgf0.png

     

     

    추상 메소드인 Execute를 직접 구현해야 합니다. 이 메소드는 엔지엠 에디터에서 커스텀 액션이 실행될 때 자동으로 호출되는 메소드입니다. 그렇기 때문에 이 메소드를 구현할 때 몇가지 패턴을 따라야 합니다. 가령 시작할 때 속성을 초기화하고, 마지막에 외부에 알려야할 정보들을 속성에 넣어줘야 합니다. 이런 내용들도 커스텀 모듈 강좌에 자세하게 설명되어 있으니 한번쯤 정독하시는걸 추천 드립니다^^

    public override void Execute()

     

    이제 마지막입니다. 프로젝트를 컴파일하세요. 아래와 같이 라이브러리가 만들어집니다.

    OzbvifA.png

     

     

    엔지엠 에디터를 실행하고, ①사용자 도구를 확인 해보세요. 아직은 아무것도 없을겁니다. 우리가 만든 커스텀 모듈을 설치하기 위해 ②도구 모듈 설치를 클릭하세요. 이 메뉴는 관리자에 있습니다.

    c9L9zvj.png

     

     

    CustomNaverNewsCrawler.dll 을 선택하세요.

    Hkub7As.png

     

     

    커스텀 모듈이 설치되면 사용자 도구에 웹크롤러가 추가된것을 볼 수 있습니다.

    aBOIyjg.png

     

     

    웹크롤러 카테고리 안에 네이버뉴스 크롤링 액션이 추가 되었네요^^

    o9eJF6v.png

     

     

    첨부되어 있는 스크립트를 열어보세요. 웹 API에 대해 자세한 내용은 [ 메뉴얼 ]을 참고하시고, 미리 학습하시는게 좋습니다.

    4ozmhcA.png

     

     

    실행하면 바탕화면에 "News.csv"가 만들어집니다. 내용을 보면 네이버뉴스에서 비트코인 관련 기사들의 제목과 뉴스 원본을 볼 수 있는 링크가 정리되어 있습니다.

    dQh0yaL.png

     

     

    사실, 좀 더 복잡하게 크롤링할 수 있게 만들수도 있는데요. 간단하게 진행하기 위해 이정도로만 처리 했습니다. 커스텀 모듈 개발에 익숙해지면 복잡한 로직과 이미지 분석, 문자 판독은 엔지엠에 맡겨두고 자신의 회사 업무만 모아서 처리할 수 있습니다. 엔지엠 RPA가 활성화되고, 많은 회사에서 이용한다면 엑셀, 워드, 파워포인트를 비롯한 여러가지 인터페이스가 좀 더 쉽게 연결될 수 있을겁니다. 그리고 무엇보다 중요한~ 리포팅도 커스텀으로 제공할 수 있겠죠? QA 업무쪽에 소프트웨어 품질 관리에 도입했다면 변경점에 대해 재연 테스트를 진행하고 결과를 리포팅해야 합니다. 리포트는 단순히 테스트 케이스에 대한 결과일수도 있고, 지표를 그래프로 표시할수도 있습니다. 수백 수천건의 테스트 케이스를 사람이 직접 하기보다는 엔지엠 RPA를 이용해보는건 어떨까요?

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천3 비추천0

    첨부파일

    댓글목록

    등록된 댓글이 없습니다.