본문 바로가기
브라우저 자동화&크롤링/python+selenium

셀레늄-IE 크롤링 중 파일 자동다운로드 방법(진행중) feat. win32

by 일코 2021. 5. 9.

필자는 내부(폐쇄)망 컴퓨터를 통해 일을 한다.

대부분의 업무는 IE브라우저를 통한 그룹웨어와, 악명(?)높은 아래아한글 문서로 처리하기 때문에 자동화가 수월하지 않다. 로그인 인증은 액티브X를 통해 진행되기 때문에 IE를 떠날 수도 없다. 최신 RPA 툴로는 더욱 자동화하기 힘들다. 이 글을 읽으시는 분이 공무원이거나 공공기관 직원이라면 공감하실 것이다. 특히 파이썬 유저라면, 엑셀파일을 pandas의 DataFrame으로 불러와서 데이터 가공을 하고 싶은데, 내부망에 엑셀파일을 옮기자마자 FasooDRM 때문에 암호화되고... 데이터는 불러와지지도 않는다. 옆의 인터넷망에선 노션과 트렐로, 마소 구글 네이버 카카오 모든 계정 로그인이 불가하고 엎친 데 덮친 격으로 아나콘다도 차단, pip download도 불가하다.

이런 악조건들의 해결책이 전혀 없는 건 아니지만

그래도 '굳이 이렇게까지 해서 자동화를 시도하는 게 옳은가? 아니, 무슨 부귀영화를 누리자고...' 라는 부정적인 생각이 스멀스멀 올라오는 건 어찌할 수가 없다. 그럼에도 불구하고, 똘끼로 일보전진해본다.

 

이번 시간에는 셀레늄 - 인터넷 익스플로러 크롤링 중 첨부파일을 다운로드 하는 방법에 대해 기록(향후 소개?)하고자 한다.

예시로 소개하는 사이트는 과학기술정보통신부 홈페이지(https://www.msit.go.kr) 연구성과 페이지이다.

굉장히 구성이 깔끔하고 잘 만들어진 사이트라고 생각된다.

속도도 빠르며, 무엇보다 평소 트래픽이 많지 않을 것으로 생각되었다.

 

전체 - 과학기술정보통신부 >

 

www.msit.go.kr

상단의 글을 하나 선택해 보면,

하단에 다운로드 버튼이 있다.

다운로드 버튼

클릭하면 다운로드가 시작되어야 하나, 익스플로러와 크롬에서 다운로드하는 방법 중 가장 큰 차이는 바로,

이 놈
다운로드팝업

이 놈이 항상 뜬다.


크롬의 경우는 어떨까?

반면 크롬은,

저장위치확인 해제

이렇게만 설정해 놓으면

클릭 시점에 다운로드가 자동으로 시작됨

너무 쉽게 다운로드가 완료된다. 해당 폴더에서 shutil.move 등으로 복사해 오기만 하면 된다.

익스플로러에서 해결해야 하는 점은,

하여튼 익스플로러는 하단의 다운로드 팝업

바로 요 놈

이걸 처리해 줘야 한다. 여러 스택이 쌓이면 다운로드가 시작되지도 않는다. 쾌적한 백그라운드 크롤링을 위해서 여러 가지 방법을 시도해 보았지만, 어느 정도 한계가 있음을 느끼고 있다. 우선 지금까지 알아낸, 또는 예상해보는 점은,

 

0. 저 창이 뜬 상태에서 Alt-S를 누르면 다운로드 폴더로 저장이 시작된다.

0. 다운로드가 진행중일 때에는 캐시 폴더 하위에 파일명.랜덤문자열.partial 등의 이름으로 저장되며

0. 다운로드가 완료되었을 때 캐시폴더에서 설정된 다운로드 폴더로 이동된다.

1. 하단의 다운로드팝업도 별개의 윈도우 클래스로, spy++ 등의 툴로 인스턴스 핸들을 알아낼 수 있다.

2. 파이썬의 win32api로 브라우저에 키스트로크를 보낼 수 있다.

3. 하지만 키스트로크를 보내려면 창이 활성화되어 있어야 한다.

4. ShowWindow API - ShowWindow(hwnd, SW_HIDE)를 사용해서 백그라운드로 숨겨지게 할 수 있다.

5. 다행인 점은 백그라운드 상태에서 활성화는 가능하다. 백그라운드에 숨겨진 창에 키스트로크를 보낼 수 있다.

6. 하지만 완전히 별개로 "PC에서 다른 작업을 하고 있으면서" 크롤링을 진행하는 것에는 무리가 있다.

    왜냐면 Alt-S 스트로크를 브라우저에 보내기 위해 포커스를 이동하는 시점에

    키보드나 마우스를 사용중이라면 문제가 발생한다. 스트로크가 씹힌다든지, 작업창에 스트로크가 들어와버린다든지..

 

API방식으로 브라우저나 다운로드창에 직접 메시지를 보내는 방식이라면 해결될 것 같은데,

조사를 더 해봐야겠다.

 

아래는 시연영상.

 


[실행영상ver.1] (크롤링에 9분, 문서병합까지 총 14분 소요)

프로토타입. body태그에 Ctrl-J를 넣어서 다운로드창을 별도로 여는 방식으로 처리했다. sleep을 너무 많이 넣었다.

 

[실행영상ver.2] 두 번째 시도(크롤링에 3분, 문서병합까지 총 7분 소요)

진행중. 위와 바뀐 점은 브라우저에 윈도우API를 통해 Alt-S 키스트로크를 넣었고, 백그라운드에 숨겨도 진행되기는 한다.

크롤링 시간이 줄어든 건, 불필요한 sleep을 배제하거나 셀레늄의 WebdriverWait 등으로 교체하고, 자바스크립트오류 등 예외처리를 덕지덕지 붙여준 덕분.

 

오늘부터는 스택오버플로 등을 구글링해서, Alt-S 키스트로크를 대신할 API명령어가 있는지 찾아봐야겠다.

 

 


donaricano-btn

댓글