2018년 01월 16일
15년여만의 Web Crawler(웹크롤러) 리뷰
요새 'crawler' 관련 강좌가 눈에 많이 띄기도 하고, 아주 가~끔 써먹기도 해서
요즘에 소개되는 웹크라울러 소개 내용이나 Tip들을 리뷰해보았다.
원래는 PPT 자료로 만들어서 slideshare 등에 올릴까 하다가, 주말지나고 나서 의욕이 사라졌지만,
최소한의 것 정도는 기록에 남기려고 적는다.
(웹.알.못인 주제에 아주 살짝 훑어보고, 테스트 해 본 거라 잘못된 것이 당연히 있을 수 있다.)
. 요즘에 소개되는 crawler 강좌 들은 엄밀히 말해서, crawler를 만든다기 보다는
Web automation or web scraping 에 관련된 tip 들이더라.
제대로 된 웹크라울러를 만들려면, 하이퍼텍스트 다큐먼트들간의 네트워크 구조에 대한 고려(알고리즘 설계)와
시스템 프로그래밍(분산처리 등) 스킬도 중요한 데, 그런건 없더라.
굳이 말을 만들자면, 웹크라울러 기초 강좌 정도 되겠더라.
. Javascript에 의한 동적페이지 컨트롤 때문에, 보통 Selenium을 이용한 방법들이 많이 소개되는데,
개인들이 특정한 목적에 사용하기에는 나쁘지 않은 방법이라 생각이 든다.
. Selenium을 쓰기 위해서, 예전에는 Selenium server를 가동시킨 뒤, 클라이언트를 만들어서 접속시켜
웹브라우저를 제어하는 방법이 주로 쓰였는데,
요즘은 서버 없이 Chrom이나 Firefox를 직접 제어하는 모듈이 많은데, 이것도 개인들이 사용하기에는 오히려
편리한 것 같다.
. 예제로 많이 쓰이는 것들이 Google이나 Naver로 접속해서 검색하고, 그 결과 가져오는게 많은데,
사실 이런건, 예전의 웹접속 모듈써도 다된다.
본인이 거의 17년(?)정도 전에 LWP로 만든 코드도 잘만 동작한다. Python의 scrapy 같은 코드들도 잘 동작한다.
. 따라서, scraping만 할거라면, 그리고, 해당 작업이 이벤트 성이 아니라 주기적으로 많은 양을 스크래핑해야 한다면,
시간이 걸려도, 웹문서를 파싱해서 처리하는게 나을 듯 하다.
(뭐, 서버가 빵빵하면야..)
. Selenium 기반의 Chrom/firefox 제어 모듈을 사용하는 예제들은 Python이 제일 많던데, Perl 쪽 모듈도 나와있어서
거의 동일하게 쓰일 수 있다. method들도 Selenium에서 제공하는 것들을 wrapping한 것이라 언어별 차이는 별로 없더라.
(Javascript, Perl, Python, Ruby, autoit, Java,등등 본인 손에 익은 것 쓰면 되겠더라)
. 처음 프로토타입을 만들때는, 크롬이나 파폭, IE 등을 직접 띄운 다음에 디버깅하면서 만드는게 당연히 좋겠지만,
코드가 완성된 다음에는 PhantomJS 같은 headless browser를 쓰는게 컴퓨터 리소스 활용 측면에서 낫겠더라.
. 외부 웹브라우저 종류(Chrom, Firefox, phantomJS 등)에 따라 약간씩 의도치 않은 결과를 내는 수가 있더라.
이게, 개인별 설정, 외부 App을 추가하거나 등등의 이슈인 경우도 있기에 좀 신경쓰이는데, 이런것들은 그때그때 알아서 해야 할듯.
오히려, PhantomJS가 이런면에서는 오동작이 적더라,
(다만, 초기 개발할 때 좀 번거로울 수 있더라)
. Selenium을 사용하는 건 메모리 자원이 많이 든다. 생각보다 많이 든다.
VM에서 쓸거면, 메모리할당을 많이 해야 한다.
개인PC에서라면, virtualbox 기반은 테스트 정도면 모르겠지만 본격 사용은 비추다.
. 웹을 억세스하면서 어떤 동작을 취하고, 그 결과를 기다리는 일련의 과정이기 때문에, 꼭 timeout을 넉넉히 셋팅해야 함.
. 또다른 측며으로는, 너무 빠른 웹페이지 억세스는 상대측 서버에 부하를 주기도 하거니와 공격으로 오인받아 블럭당할 수 있기에,
waiting time을 넉넉히 줘야 한다.
. 전반적으로 한글을 입력해야 할 일이 있을 때, 유니코드 핸들링 때문에 까다로울 수 있는데,
Python은 그냥 Python3로, Perl을 쓸때는 'use utf8' 프라그마를 켜놓고 쓰는게 속편하다.
. 처음에는, 문자열 처리를 많이 할거면, 아무래도 Perl이 나으리라 생각했는데, 다시보니
요즘에는 웹문서를 다 고유의 파싱모듈을 써서 처리한다.
Perl이라면 HTML::TreeBuilder 등의 HTML 모듈, Python이라면 이름도 이쁜 BeautifulSoap 등등..
그냥 손에 익은 언어에서, 사람들이 제일 많이 쓰는 모듈 쓰는게 속 편할 듯.
. 본인이 웹쪽 일을 안하기 때문에 인식을 못하고 있었는데,
십여년전과 달리, 웹페이지들이 요즘은 자동으로(그리고, 여러 목적으로 인해) 간단해 보이는 웹문서들도 내부 소스는 엄청 복잡하더라.
더더욱 파싱모듈을 사용하는게 맞는 것 같다.
. 예전에는 몰랐는데, Xpath(XML Path Language)라는 게 있더라..
요즘 복잡한 웹페이지에서 특정 element를 억세스하는데 있어서 Xpath를 쓰는게 제일 낫더라.
그리고, xpath는 크롬/파폭에서 개발자도구('F12' 버튼)로 쉽게 확인이 가능하니, 이런식으로 접근하는게 나같은 웹알못에게는 제일 나은 듯.
. 정리하면, 개인이 작은 목적으로 웹스크래핑 등을 하기에는 참 좋은 환경이다.
수 많은 모듈, 도구들이 지원되니까..
반대로, 본격적인 웹크라울러를 만들기에는 예전보다 더 어려운 세상이 되었다. 투자리소스와 기간이 더 길어질 듯.
아직도, 은근(?)히 웹크라울러에 대한 수요가 있으니까(자리는 적지만 pay는 쎄다. 기술장벽이 높기도 하고).
이쪽에 관심이 있으면 꾸준히 공부해 보는 것도 나쁘지 않을 듯.
# by | 2018/01/16 11:45 | IT | 트랙백 | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]