Web Crawling - 검색 자동화(C#, Selenium)

GUNHEE LEE·2024년 2월 28일
0

Web Crawling

목록 보기
1/2
post-custom-banner

Visual Studio Code에서 C#을 이용해 크롤링하는 과제를 받았다.
크롤링 대상 사이트는 '나라장터'이다.
키워드와 기간을 검색한 후 테이블의 데이터를 엑셀에 저장하는 과제였다.

1. VS code 에서 C# 프로젝트 만들기

How to Program C# in Visual Studio Code [2023]
이 영상을 참고해서 C# 프로젝트를 생성했다.
방법은 다음과 같다.

  1. Extension에서 C# Dev Kit 설치
  2. VS code를 다시 시작하고 'C# 개발 키트 시작' 을 따라한다.
  3. .NET SDK가 설치되었는지 확인한다. dotnet --version 커맨드로 설치 여부를 검사할 수 있다.
  4. 작업할 폴더를 연다. '.csproj' 파일이 위치한 폴더이다. 없으면 검색창에서 새로 생성한다.
  5. 검색창에 >.NET: New Project 로 새 프로젝트를 생성할 수 있다.
  6. 새 프로젝트의 이름을 생성했다면 하위 파일 중 '.cs'가 포함된 파일에서 작업하면 된다.
  7. 실행과 디버그 창에서 '모든 자동 디버그 구성 표시' -> '인터페이스 변경' 을 누르면 왼쪽 상단에 녹색 실행버튼이 생성되는데 이걸로 디버깅하면 된다.
  8. 추가로 GitHub Copilot을 설치하면 코딩할 때 도움이 된다고 한다.

2. Selenium

[셀레니움/Selenium. C#] 웹 페이지의 텍스트 박스에 문자열 입력하기 (예제 포함)
[셀레니움/Selenium, C#] 웹 페이지의 버튼 클릭하기 (예제 포함)
[셀레니움/Selenium, C#] 테이블의 셀 데이터 취득하기 (예제 포함)

상단의 블로그 게시물을 참고해서 전체 프로세스를 이해했다.
코드 작성은 GPT4를 사용했다.

3. 검색 자동화

위 캡쳐본은 나라장터의 검색창의 일부를 캡쳐한 것이다.

과제는 다음과 같다.

  1. 공고명에 'RPA'를 입력한다.
  2. 공고/개찰일에 각각 오늘날짜로부터 5일전 날짜/오늘날짜를 입력한다.
  3. 검색버튼을 클릭한다.

이 세 가지 단계를 자동화해야 했다.

1. 공고명에 'RPA'를 입력한다.

텍스트 박스를 개발자 도구로 검사한다. 공고명 검색창의 Xpath는 //*[@id="bidNm"] 이다. 이제 이 태그를 찾아 검색어를 key로 보내주면 된다.

아래 코드는 다음과 같이 동작한다.

1-1. 원하는 URL로 이동한다.
1-2. 페이지가 정상적으로 로딩될 때까지 기다린다.
1-3. id 태그가 bidNm인 element를 찾아서 "RPA"를 key로 전송한다.

// Navigate to the website
driver.Navigate().GoToUrl("https://www.g2b.go.kr/index.jsp");

// Wait for the page to load completely
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

// Find the search input by its ID and enter a search term
var searchInput = driver.FindElement(By.Id("bidNm"));
searchInput.SendKeys("RPA");

2. 공고/개찰일에 각각 오늘날짜로부터 5일전 날짜/오늘날짜를 입력한다.
다음으로 조회하려는 기간을 'yyyy/MM/dd'의 형태로 입력해야 했다. 이를 위해 오늘 날짜를 계산하고 4를 빼서 조회기간을 설정했다. 그 후 날짜 입력 창의 id에 조회기간을 key로 전송한다.

아래 코드는 다음과 같이 동작한다.

2-1. 오늘 날짜와 5일 전 날짜를 계산한다.
2-2. 데이터를 yyyy/MM/dd 형태로 format한다.
2-3. id 태그가 fromBidDt와 toBidDt인 element를 찾아 format 한 데이터를 입력한다. 검색창이 채워져 있을 수도 있으니 Clear()로 지워준다.

// Calculate the today dates
DateTime today = DateTime.Today;
DateTime fiveDaysAgo = today.AddDays(-4);

// Format the dates as YYYY/MM/DD
string todayFormatted = today.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture);
string fiveDaysAgoFormatted = fiveDaysAgo.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture);

// Find the start date input by its ID and enter the calculated date
var fromDateInput = driver.FindElement(By.Id("fromBidDt"));
fromDateInput.Clear(); // Clears any pre-filled values in the input field
fromDateInput.SendKeys(fiveDaysAgoFormatted);

// Find the end date input by its ID and enter today's date
var toDateInput = driver.FindElement(By.Id("toBidDt"));
toDateInput.Clear(); // Clears any pre-filled values in the input field
toDateInput.SendKeys(todayFormatted);

3. 검색버튼을 클릭한다.
검색 버튼의 Xpath를 복사해서 Click()한다.

// After entering the dates, click the search button 
var searchButton = driver.FindElement(By.XPath("//*[@id=\"searchForm\"]/div/fieldset[1]/ul/li[4]/dl/dd[3]/a/strong"));
searchButton.Click();

위 단계를 거치면 검색 자동화 완성이다.
코드를 실행하면 자동으로 테이블이 위치한 페이지로 이동한다.
다음 게시글에서 테이블의 셀 데이터를 취득하는 방법을 알아보자.

profile
새싹 개발자
post-custom-banner

0개의 댓글