본문 바로가기

DEV/C#

크롤링으로 나라장터 검색-화면 구성 및 사전규격

반응형

 화면구성


아래 폼은 예시입니다. 메일연동, 검색어 정보를 내부 DB저장 등의 기능은 제외하고 크롤링 기능을 설명드리겠습니다.


 크롤링 설정(전역변수 및 옵션)

// 크롤링 관련 전역 변수 설정

protected ChromeDriverService _driverService = null;
protected ChromeOptions _options = null;
protected ChromeDriver _driver = null;
protected string anncmUrl = "http://www.g2b.go.kr:8101/ep/tbid/tbidFwd.do";
protected string beforeUrl = "http://www.g2b.go.kr:8341/bs/beffatStndrdSearchSrch.do";

크롤링 드라이버와 옵션, 서비스 전역 변수를 선업합니다.
그리고 크롤링 대상인 주소 2개(사전규격, 입찰공고)의 주소를 등록합니다.

 private void FormShown(object sender, EventArgs e)
{
	try
	{
		_driverService = ChromeDriverService.CreateDefaultService();
		_driverService.HideCommandPromptWindow = true;

		_options = new ChromeOptions();
		_options.AddArgument("disable-gpu");
		_options.AddArgument("headless"); // 창을 숨기는 옵션입니다.
	}
	catch (Exception ex)
	{
		textBoxLog.Text += ex.ToString();
	}
}

폼이 보여지고 나서 나서 크롤링 관련 옵션을 설정합니다. 
 
_options.AddArgument("headless"); // 창을 숨기는 옵션입니다.

이 옵션을 적어 두시면 실제 웹화면이 보이지 않게 동작됩니다.
구현중이거나 확인이 필요하실 때는 주석 처리 후 사용합니다. 

 

 사전규격 검사


사전규격을 검사할 수 있는 주소로 이동합니다.

http://www.g2b.go.kr:8341/bs/beffatStndrdSearchSrch.do

위 화면 중 업무 구분(일반용역)을 선택한 뒤 사업명을 입력하여 검색해 보도록 소스를 구현하겠습니다.

 

public void GetBeforeInfo(string word)
{
	try
	{
		string searchWord = word;

		_driver = new ChromeDriver(_driverService, _options);

		//웹사이트 이동
		_driver.Navigate().GoToUrl(beforeUrl);

		//용역만 선택
		var checkbox = _driver.FindElementById("taskClCd9"); //일반 용역
		checkbox.Click();

		//id값이 bidNm인 태그 가져오기
		IWebElement prodNm = _driver.FindElementById("prodNm");
		//내용을 삭제 (버릇처럼 사용할 것!)
		prodNm.Clear();
		//검색어 입력후 엔터
		prodNm.SendKeys(searchWord);

		//검색 버튼 클릭
		IWebElement searchBtn = _driver.FindElementByClassName("btn_mdl");
		searchBtn.Click();

		//검색결과 확인(확인 필요)
		IWebElement elem = _driver.FindElementByClassName("results");

		//두번 조회해야 내용이 보임...
		if (elem == null)
		{
			elem = _driver.FindElementByClassName("results");
		}

		string tmp =  elem.Text + "\r\n";

		if( tmp.IndexOf("검색된 데이터가 없습니다.") > -1 )
		{
			tmp = tmp.Replace("업무 등록번호 사업명 수요기관명 공개일자 의견등록마감일시 SW사업 구분\r\n", "");
		}

		textBoxLog.Text += tmp;
	}
	catch (Exception ex)
	{
		textBoxLog.Text += ex.ToString();
	}
	finally
	{
		_driver.Quit();
	}
}

사전규격으로 찾을 검색어를 인자로 하여 해당 문자열을 찾아옵니다.



 참고사항

나라장터 사이트는 디버깅 방지가 되어 있어 크롬, IE에서 F12 디버깅 모드가 제공되지 않아 항목들의 ID, NAME, TAG 정보들을 추출하기가 어렵습니다.

_driver.Navigate().GoToUrl(beforeUrl); //페이지 이동 후 

검색할 페이지로 이동한 뒤 디버깅 하여 html 코드를 가져와서 분석 하시는 걸 추천드립니다.

_driver.PageSource의 내용을 확인



관련글 보기

2021.07.27 - [DEV/C#] - 크롤링으로 나라장터 검색-개요

2021.07.27 - [DEV/C#] - 크롤링으로 나라장터 검색-개발환경 구축





반응형
댓글