티스토리 뷰

반응형

오늘의 삽질 - Selenium 와 Ubuntu

이걸 scraping 이라고 해야하나, crawling 이라고 해야하나...어쨌든 웹사이트에서 특정 정보를 자동으로 긁어와야 할 일이 있어서 간단하게 만들려고 했습니다. 다만, Python 으로 더듬더듬 하는 것보단 Java 로 조금은 자료가 적더라도 공식문서 보고 하는게 빠르겠다는 생각에 jsoup 나 selenium 정도의 이름만 보고 개발을 시작했습니다. crawler4j 처럼 본격적인 crawling 까진 아니므로...

jsoup 으로 웹페이지를 조회하고 내용을 분석

특정 페이지에서 검색을 통해 결과목록을 확인하고, 각 link 을 눌러 상세 정보를 가져오는 형태이기 때문에 검색 시 어떻게 URL 을 호출하는지 확인했습니다. jsoup 로 순조롭게 처리했고, 결과목록을 selector 로 무난하게 추출했습니다.

상세내용이...ajax 로 가져오네?

검색결과에서 그냥 정적인 값으로 표시되길래 방심하고 있었는데, 상세내용은 죄다 ajax 로 값을 가져오게 해놨더군요. 물론 ajax 호출 URL 을 분석해서 json 값을 parsing 해서 처리할 수도 있지만, 코드 자체가 javascript 최소화 적용을 해놔서 가독성도 엉망이고, 호출되는 숫자값이 상세페이지 호출 시 사용하는 값에 포함 안된 것도 많아서...간단하게 끝날 문제가 아니었습니다.

그래서 jsoup 로 상세페이지를 가져와도 실제 값을 selector 로는 가져올 수 없었기에...

눈물을 머금고 selenium 추가

selenium 은 웹브라우져를 연동해 처리하기 때문에 무겁기도 하고 여러 문제가 다수 나올 것이 뻔했지만, Java 에서 웹브라우져 없이 동적인 처리를 해준다는 HtmlUnit 같은 라이브러리는 Javascript 처리 시 오류가 다수 발생하고(특히 javascript 최소화 적용 코드일 경우 더욱) 이 오류로 인해 처리하려던 상세페이지에서 값을 제대로 가져오지도 못했습니다.

별 수 없이 selenium 을 고민할 수 밖에 없었습니다.

headless browser

Oracle Database 8i 부터 설치 시 GUI 환경이 필수가 되었었기 때문에 어쩔 수 없이 Linux 설치 시에 X Window 도 설치해야 했지만, 이 경우를 제외하곤 아주아주 특별한 경우가 아니라면 TUI(혹은 CUI) 환경에서 ssh 로만 접속해서 서버를 운영하고 있습니다. Linux 특성상 커널에서 동작하는게 아니고 소켓통신으로 X Window 가 동작한다지만, 너무 많은 프로그램들이 깔리기 때문에 어떤 사태가 발생할지 가늠할 수 없기 때문에 최소한만 설치하고 대응하기 위해서입니다.

그런데, 웹브라우져는 거의 대부분 GUI 환경에서 돌아갑니다. 당연하다면 당연한거지만. 그게 아니라면 Usenet, Gopher 등의 서비스가 스러져갈 이유가 없었을 겁니다. GUI 는 사용자 친화적이고, 당연히 Web Browser 는 GUI 에서 돌아가며, 상당수의 콘텐츠는 Web Browser 를 통해 제공되며, 지금 하려는 작업도 Web Browser 로 정보를 가져와 필요한 부분만 읽어야 하는 것이었습니다. 즉, 평소에 까는걸 극혐하는 X Window 를 깔아야 한다는 의미였습니다.

 

하지만, Firefox 에서 headless browser 라는 개념을 내놓았고, Chrome 와 같은 다른 브라우져들도 이를 지원하면서 X Window 없이 TUI 환경에서도 웹사이트를 조회하고 결과를(Javascript 동작까지 해서 동적으로 생성된 HTML 까지 모두) 조회할 수 있게 되었습니다. 일반적으로 Chrome 사용자층이 더 많지만 저는 원래부터 Firefox 를 더 선호했고, Selenium 의 경우 Firefox 가 좀 더 사용성이 좋습니다. 그 이유는, Chrome 의 경우 프로그램과 Web Browser 사이에 연결을 해주는 Driver 라는게 존재하는데, Chrome 은 버전에 맞춰 Driver 를 정확히 맞춰줘야 하는 불편함이 있는데(사실 이것도 나중에 큰 문제는 아니라는 걸 알아버림), Firefox 는 하나의 Driver 버전에서 지원하는 Firefox 버전이 훨씬 다양하기 때문입니다. 그래서 더욱 문제가 커졌지만...

Proxmox Lxc 로 Ubuntu 22.04 LTS 을 CT 로 내려받아 후딱 해보니

백문이 불여일타...라고는 하지만, 귀차니즘이 많은 저는 Mac/Windows 에서 모두 잘 동작하는 것을 확인하고서야 개인적으로 운영중인 Proxmox 가상환경에 CT(Container)로 Ubuntu 22.04 를 내려받아 X Window 없이 잘 동작하는지 확인하려고 했습니다.

그런데...

apt 로 Firefox 설치가 안됩니다? snap 이 문제네요. 원래 이놈이 가상 머신에선 잘 안됩니다.

그래서 VM 으로 Ubuntu 22.04 이미지를 이용해 직접 설치한 뒤 git, openjdk-17-jdk, firefox 세 개만 apt 로 후다닥 설치하고 만든 프로그램을 실행했습니다.

네...

안됩니다. T.T

구글링 엄청 했습니다.

중간 과정 모두 생략하고 결론만 말하자면

snap 으로 설치된 firefox 는 geckodriver 에서 profile 을 저장하는 tmp 접근권한이 없어서 정상동작 하지 않습니다

profile 저장경로를 수동으로 줘봤으나, geckodriver 버전이 낮아서 그런지 현시점에선 잘 안되더군요. 수정된 버전이 2022년에 배포되었다는데...

어짜피 CT 에서 안된 이유도 snapd 때문인데, 이게 Ubuntu 에서는 22.04 버전부터 도입되었으므로 깔끔하게 20.04 로 설치하면 해결이 가능합니다. 참고로 22.04 에서는 apt 로 설치해도 snap 으로 설치를 넘겨버리므로, 직접 Firefox 를 내려받아 수동설치 하지 않고 패키징 시스템으론 해결 안됩니다.

 

오늘의 결론

Selenium 에 Ubuntu 쓸꺼면 20.04 써라. 두 번 써라.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함