문제
주 1회 조회를 수행하여 Weekly 시트에 기사 제목을 입력하고 중복기사를 제거한 뒤 Essential 시트에 내용을 쌓는다.
조건
검색창에 RPA 입력
상세검색 1주
기사 100건 보기
제목, 언론사, 날짜, URL의 데이터 취득
해설
Transaction은 초기처리, 주처리, 종료처리 세 단계로 나누어 작성하였습니다.
초기처리에는 Script Code를 사용하여 파일 경로를 변수에 설정하였습니다.
주처리는 작성한 모듈을 Custom Module Item을 통해 불러와 사용하였습니다.
Custom Module 분석
Custom Module에 이러한 주처리 과정을 작성하였습니다.
01. BigKinds 접속 및 검색
- 메세지 Script Code를 통해 에러 발생시 변수에 string값을 입력하여 에러 메세지를 개발자에게 알립니다.
- Process Kill을 통해 열려있는 IE를 종료합니다.
- Internet Browswer를 통해 bigkinds에 접속합니다.
- Active Window를 통해 bigkinds 창을 활성화 시켰습니다.
- Object SetValue를 통해 RPA를 입력하는 과정을 수행하였습니다.
- 세부 설정은 Image Click을 이용하였고, 만약 세부사항이 설정되지 않았을 경우 Loop를 통해 재수행합니다. 설정이 정확히 이루어진 경우 Loop Break를 통해 Loop를 종료하고 다음 event로 넘깁니다.
- 적용하기 버튼을 클릭합니다.
02. 기사 데이터 가져오기
- 원하는 창이 열려있는지 Image Check를 통해 확인합니다. 만약 열려있으면 설정을 시작합니다. '100건씩 보기'가 클릭되지 않았을 시 다시한번 Loop합니다. 정상수행시 Loop Break를 통해 종료합니다.
- 마지막 값을 HTML GetValue를 통해 저장합니다. string 형태로 저장되기 때문에 int로 형변환하는 과정을 거쳤습니다. 이것은 LoopCount에 사용됩니다.
- 가져온 LoopCount (intLastCount)만큼 값을 가져오는 Loop를 수행합니다. 제목, 언론사, 날짜, URL의 데이터를 취득합니다. 가져온 데이터는 list에 저장합니다(역순으로)
02-1. X Click
02번 모듈의 Exception Loop를 사용하기 위해 모듈을 따로 사용하였습니다.
03. 엑셀 정리
정제가 되지 않은 데이터의 내용을 엑셀의 Weekly에 붙여넣는 과정을 구현하기 위해 Excel Script를 사용하였습니다.
04. 중복기사 제거
데이터를 정제하고 Essential 시트에 값을 넣기 위한 Excel Script를 작성하였습니다.
간략한 코드를 첨부합니다.
더보기
for (a=2 ;a<xl.GetLastRowIndex ();a++) { /***********************************************************************************************************/ str1=xl.GetOneCellValue ("D" + a); str1=Regex.Replace (str1, @"[^a-zA-Z0-9가-힣_]" , "" , RegexOptions.Singleline); lstStr1.Clear (); for (b=0 ;b<=str1.Length-2 ;b++) { lstStr1.Add (str1.Substring (b,2 )); } /***********************************************************************************************************/ for (c=a+1 ;c<=xl.GetLastRowIndex ();c++) { str2 = xl.GetOneCellValue ("D" + c); str2=Regex.Replace (str2, @"[^a-zA-Z0-9가-힣_]" , "" , RegexOptions.Singleline); lstStr2.Clear (); /***********************************************************************************************************/ //여기부터 str2의 처리부분 for (d=0 ;d<=str2.Length-2 ;d++) { lstStr2.Add (str2.Substring (d,2 )); } /***********************************************************************************************************/ //중복되는 만큼 서로 비교하기 위해 e에 최소 Count값을 저장 if (lstStr1.Count>lstStr2.Count) e = lstStr2.Count; else e = lstStr1.Count; /***********************************************************************************************************/ //최소 Count값만큼 lst index를 비교하여 교집합과 합집합으로 lst에 저장 lstSMA.Clear (); string tmp1="" ; string tmp2 = "" ; //교집합 for (f=0 ;f<e;f++) { tmp1 = lstStr1 [f]; for (int m=0 ;m<e;m++) { tmp2 = lstStr2 [m]; if (tmp1.Equals (tmp2)) { lstSMA.Add (tmp2); } } } /***********************************************************************************************************/ lstCUP.Clear (); //합집합 for (g=0 ;g<e;g++) { if (!lstCUP.Contains (lstStr1[g])) { lstCUP.Add (lstStr1[g]); } if (!lstCUP.Contains (lstStr2[g])) { lstCUP.Add (lstStr2[g]); } } /***********************************************************************************************************/ //교집합과 합집합의 계산 float sma, cup; sma = lstSMA.Count; cup = lstCUP.Count; floatDiv = (sma / cup); if (floatDiv>0.1 ) { xl.DeleteRow (c); c--; } } } for (int del=2 ;del<=xl.GetLastRowIndex ();del++) { lstDelTitle.Add (xl.GetOneCellValue ("D" + del)); lstDelURL.Add (xl.GetOneCellValue ("E" + del)); }
Linq등을 이용하면 손쉽게 처리할 수 있는 부분이었지만 현재 사용할 수 있는 언어를 통해 직접 해결하고 싶어 C언어의 방식으로 구현하였습니다.
중복기사 제거를 위해 제목의 유사도를 검색하는 것이 가장 좋을것 같아 유사도 제거 방식으로 구현하였습니다.
자카드 유사도를 참고하여 직접 작성해 보았습니다.
위 코드는 가져온 글자를 두글자씩 나누어 합집합과 교집합으로 계산한 후 나누어 유사도를 계산하는 알고리즘을 구현하였습니다.
해당 알고리즘을 통해 10% 이상 일치시 해당 row를 제거하는 방식으로 정제를 진행하였습니다.
05. 로그인 후 게시글 작성
1. 열려있는 IE 종료
2. 사이트 접속
3. 창 활성화 후 로그인 및 아이디, 패스워드 입력
4. 카테고리 클릭 후 게시글을 작성하는 로직 구현
개선 방향
- Exception Loop의 정확한 사용법을 숙지한 후 사용
- 알고리즘의 변수명 수정
- Wait Time의 사용 줄일수 있는 방법 (무자비한 사용은 시간낭비를 초래하기 때문)
- 알고리즘 구현시 불필요한 코딩을 줄이기 위해 다양한 함수 활용
- 최적화
실행영상