-
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; } }
반응형'닷넷 > C#' 카테고리의 다른 글
C# 번역 파파고 API 사용하기 (영어를 한글로, 한글을 영어로 번역) (2) 2020.03.03 C#에서 구글번역 Google Translation API Basic 사용하기 (0) 2020.02.28 C# 웹이미지 다운로드 내폴더에 저장하기 (0) 2020.01.03 C# WebBrowser없이 HTML 파싱하기(HtmlAgilityPack 사용기) (0) 2019.12.26 C# 문자열을 열 글자씩 쪼개기, 문자열 자르기 (2) 2019.06.19