Visual Studio Code에서 C#을 이용해 크롤링하는 과제를 받았다.
크롤링 대상 사이트는 '나라장터'이다.
키워드와 기간을 검색한 후 테이블의 데이터를 엑셀에 저장하는 과제였다.
How to Program C# in Visual Studio Code [2023]
이 영상을 참고해서 C# 프로젝트를 생성했다.
방법은 다음과 같다.
- Extension에서 C# Dev Kit 설치
- VS code를 다시 시작하고 'C# 개발 키트 시작' 을 따라한다.
- .NET SDK가 설치되었는지 확인한다. dotnet --version 커맨드로 설치 여부를 검사할 수 있다.
- 작업할 폴더를 연다. '.csproj' 파일이 위치한 폴더이다. 없으면 검색창에서 새로 생성한다.
- 검색창에 >.NET: New Project 로 새 프로젝트를 생성할 수 있다.
- 새 프로젝트의 이름을 생성했다면 하위 파일 중 '.cs'가 포함된 파일에서 작업하면 된다.
- 실행과 디버그 창에서 '모든 자동 디버그 구성 표시' -> '인터페이스 변경' 을 누르면 왼쪽 상단에 녹색 실행버튼이 생성되는데 이걸로 디버깅하면 된다.
- 추가로 GitHub Copilot을 설치하면 코딩할 때 도움이 된다고 한다.
[셀레니움/Selenium. C#] 웹 페이지의 텍스트 박스에 문자열 입력하기 (예제 포함)
[셀레니움/Selenium, C#] 웹 페이지의 버튼 클릭하기 (예제 포함)
[셀레니움/Selenium, C#] 테이블의 셀 데이터 취득하기 (예제 포함)
상단의 블로그 게시물을 참고해서 전체 프로세스를 이해했다.
코드 작성은 GPT4를 사용했다.
위 캡쳐본은 나라장터의 검색창의 일부를 캡쳐한 것이다.
과제는 다음과 같다.
- 공고명에 'RPA'를 입력한다.
- 공고/개찰일에 각각 오늘날짜로부터 5일전 날짜/오늘날짜를 입력한다.
- 검색버튼을 클릭한다.
이 세 가지 단계를 자동화해야 했다.
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();
위 단계를 거치면 검색 자동화 완성이다.
코드를 실행하면 자동으로 테이블이 위치한 페이지로 이동한다.
다음 게시글에서 테이블의 셀 데이터를 취득하는 방법을 알아보자.