2017년 12월 31일 일요일

파이썬을 이용한 네이버 카페 업무 자동화 2

지난 글에서 네이버 카페 특정 레벨의 회원 아이디 리스트 얻기와 찾아진 명단으로 게시글 검색하는 내용까지 다루었다. 실제 해야 하는 작업은 검색 결과를 바탕으로 회원 레벨을 조정하는 것. 이제 이 마지막 작업을 자동화할 단계이다.

회원 레벨 조정은 어느 메뉴에서든 할 수 있지만, 관리 메뉴의 전체 멤버 관리 화면이 아이디로 검색해 원하는 멤버를 찾아 레벨 조정하기 편리하게 되어 있어 그걸 이용하기로 했다.

준비 과정은 동일하게 셀레늄을 import하고 크롬 드라이버를 띄운다. 이제 브라우저 화면의 원하는 자리에 원하는 값을 넣고 원하는 버튼을 누르는 작업을 파이썬으로 한줄씩 코딩해 넣으면 된다. 물론 아이디 목록이 들어있는 파일을 읽어와서 이 작업을 반복하는 for 루프 하나 만들고.

원하는 자리나 원하는 버튼을 찾아내는 것은 지난 글에서 쓴 대로, 크롬 브라우저에서 마우스 우클릭 후 맨 아래 "검사(N)" 메뉴를 클릭하면 된다. 오른쪽에 창이 열리면서 해당 element가 반전되어 보이는데, 먼저 반전된 element에 마우스 우클릭하여 copy - copy element를 눌러보자. 메모장 등에 붙여넣어보면 element 내용을 확인할 수 있는데, 여기 id나 name 등이 포함되어 있어야 find_element_by_id(), find_element_by_name() 등으로 찾을 수가 있다. 어떤 버튼은 copy element로 보면 별다른 정보가 없는데, 이때는 copy - copy xpath를 선택하고 find_element_by_xpath()를 이용해서 찾으면 된다.



가령 (2)번 버튼의 경우 copy element로 해서 보면 "<span>검색</span>" 이렇게밖에 안 나오지만, copy xpath로 보면 "//*[@id="frmSearch"]/div/div/div[1]/a[1]/span"로 나온다.

한단계 한단계 찾아나가는 과정에서는 파이썬 쉘을 띄워놓고 한 줄씩 실행해 보고 잘 되면 코드에 넣고 그런 식으로 하면 된다.

버튼을 클릭했을 때 팝업창이 뜨는 경우가 있다. 예를 들어 등급을 선택하고 (5)번 변경 버튼을 누르면 대상자를 확인하고 코멘트를 입력하는 팝업이 뜬다. 이때는 팝업창 쪽으로 포커스를 전환해 줘야 팝업 창에서 필요한 작업을 수행하고 팝업을 닫을 수 있게 된다. 이때 필요한 명령은 driver.switch_to_window()다. 먼저 handle = driver.window_handles 처럼 해서 현재 떠 있는 창들의 핸들값을 얻은 다음, 필요한 창으로 전환하면 된다. 메인 윈도우의 핸들은 handle[0]에, 팝업창의 핸들은 handle[1]에 저장된다. driver.switch_to_window(handle[1])로 포커스를 팝업창으로 전환하면 된다.

팝업창에서 코멘트 넣고 확인 버튼을 누르면 이번엔 경고창 (alert)이 뜬다. 확인 눌러서 닫으면 되는데 이것도 처리해줘야 한다. driver.switch_to.alert.accept() 명령으로 간단하게 처리 가능. 그리고 나면 팝업창은 닫히는데, 그렇다고 해서 핸들이 메인 윈도우로 저절로 돌아가지는 않으므로 driver.switch_to_window(handle[0])로 다시 포커스를 돌려줘야 한다.

사실 노하우는 이게 거의 전부다. 문제는 이렇게 해서 돌려보니 자꾸 오류가 나는데, 그건 버튼을 누른 후 해당 웹페이지를 가져올 때까지 기다린 후 다음을 진행해야 하는데 기다리는 시간이 충분치 않아서이다. 쉘에서야 한 줄씩 차례차례 실행하니 문제가 없지만 다 짜서 돌리면 딜레이를 주지 않으면 값을 읽어오지 못한다. 게다가 이 딜레이는 인터넷 상황, 서버 로딩에 따라 매우 유동적이다. 코딩 후 테스트시에는 각 단계에서 1초의 딜레이만으로 아무 문제없이 잘 돌았는데, 막상 실제 등급 조정 작업을 120명 걸어놓고 돌려보니 단계별 3초 딜레이로도 충분치 않은 경우가 있었다. 그렇다고 무작정 길게 할 수도 없는 것이고, 확실히 로딩이 된 걸 확인하고 넘어갈 수 있는 방법이 필요하다. 아래는 총 정리된 파이썬 코드.

향후 개선 방향은 현재 아이디만 추출하게 되어 있는 것을 아이디와 별명을 함께 추출하여 사람이 보기 좋게 적절히 포맷 만들어 저장하는 것, 단계별 막연히 3초 정도 딜레이 준 것을 try - catch 문으로 1초씩 딜레이 늘려가며 로딩 확실히 될 때까지 루프 돌다가 넘어가게 하는 것이다. 그러나 내가 원래 하려던 등급 조정 작업은 이미 끝났으므로, 이 개선 작업은 과연 언제 하게될지 기약이 없다. 아마 올 연말에나 다시 하게 되지 않을까?