ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 웹크롤링 selenium 사용기
    닷넷/C# 2020. 1. 8. 22:42
    반응형

    쿠팡사이트를 크롤링하려는데 단순히 웹브라우저나 WebClient 통해서 html을 가져오는 것으로는 브라우저에 보이는 그대로 크롤링을 할 수가 없었다.
    (이는 해당 사이트에서 오른쪽마우스를 클릭해 페이지 소스보기했을 때 나오는 것과 같다.)

    selenium은 chrome 브라우저를 열어서 크롤링을 하는 부분이라 사이트에서 F12를 눌렀을 때 보이는 것과 같아 내가 원하는 것을 딱딱 크롤링할 수가 있었다.

     

    프로젝트에서 selenium을 사용하려면 먼저,

    비주얼스튜디오에 도구> NuGet 패키지 관리자> 솔루션용 NuGet 패키지 순으로 클릭한다.

    찾아보기 탭을 클릭하고, selenium으로 검색한다.

    그 중에서 Selenium.WebDriver, Selenium.WebDriver.ChromeDriver, Selenium.Chrome.WebDriver

    세 가지를 설치한다.

     

    그 다음 코드를 작성하여 사용한다.


    코드 사용 예)

    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    
    
    private void GetCoupangProduct(string _site, out string _productinfo, out string _mainimage, out string[] _image, out string _tag)
    {
        string productinfo = "", tag = "", mainimage = "";
        string[] image = { };
    
       // 크롬드라이버 사용
        using (IWebDriver driver = new ChromeDriver())
        {
            driver.Navigate().GoToUrl(_site);
            driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(10);
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
    
            // 태그에 있는 id로 검색할 때
            //   .FindElement(By.ID("어떤 태그의 ID"))
            
            //   태그내부 텍스트
            //     .Text        
            string sss = driver.FindElement(By.Id("breadcrumb")).Text;
            sss = sss.Replace("  >", "").Replace("/", "#").Replace("\r\n", "#");
            sss = sss.Replace(" ", "").Replace("#", " #");
            tag = sss.Replace("쿠팡홈", "");
    		
            
            // 태그에 있는 class로 검색할 때
            //   .FindElement(By.ClassName("어떤 태그의 class"));
            
            //   해당 태그에 속해 있는 attribute(속성)을 검색
            //     .GetAttribute("속성이름")        
            string img = driver.FindElement(By.ClassName("prod-image__detail")).GetAttribute("src");
            mainimage = GetFileName(img);        
    
    
            // 해당 클래스이름을 가진 태그가 있는지 체크하기        
            if (IsElementPresent(driver, By.ClassName("product-item__table")) == true)
            {
                var element = driver.FindElement(By.ClassName("product-item__table"));
                
                // 해당 클래스를 가진 html을 가져올 때            
                // element.GetAttribute("innerHTML")            
                var tempinfo = element.GetAttribute("innerHTML");
                
                
                // 필요없는 부분은 split으로 쪼개서 버리기..            
                string[] ss = tempinfo.Split(new string[] { "<p class=\"essential-info-more\">" }, StringSplitOptions.None);
                productinfo = ss[0];
            }
    
            if(IsElementPresent(driver, By.ClassName("subType-IMAGE")) == true)
            { 
            	// 똑같은 class 명을 가진 태그가 여러가지이며 전부 검색할 때
                // .FindElemnts(By.ClassName("어떤 태그의 class))            
                var productimage = driver.FindElements(By.ClassName("subType-IMAGE"));
                int imageindex = 0;
                image = new string[productimage.Count];
                
                // 컬렉션이기 때문에 각각을 검색할 땐 foreach를 사용
                foreach (var item in productimage)
                {
                    var sub = item.FindElement(By.TagName("img")).GetAttribute("src");
                    image[imageindex] = GetFileName(sub);
                    imageindex++;
                }
            }
        }
                
    
        _productinfo = productinfo;
        _mainimage = mainimage;
        _image = image;
        _tag = tag;
    
    }
    
    
    // 해당 정보를 가진 태그가 있는지 없는지 확인 
    private bool IsElementPresent(IWebDriver _driver, By _by)
    {
        try
        {
            _driver.FindElement(_by);
            return true;
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }

     

     

    반응형

    댓글

Designed by Tistory.