기술 조사 - 크롤링
- 크롤링 프로젝트나 기술에 대한 선행 정보가 거의 없다시피 하다.
- 고로 이 부분에선 GPT의 힘을 많이 빌릴 것이다.
자바 파이썬 중에서 언어 숙련도가 같다면
어떤 언어와 어떤 라이브러리를 크롤링에 사용하는게 좋을까? 라는 질문으로 시작해보자.
Java + Jsoup
- 장점
- Jsoup은 HTML 파싱에 최적화되어 있어 정적 웹페이지 크롤링에 매우 빠르고 안정적.
- 자바는 정적 타입 언어라, 대규모 시스템에 적합
- 멀티스레드 환경에서 많은 요청을 동시에 보낼 때 효율적
- 단점
- 자연어 처리, 데이터 시각화 쪽 생태계가 약함
- 자바로 NLP나 기계학습을 하려면 구현비용이 크다.
- SPA에서도 크롤링을 하려면, Selenium과 같은 라이브러리 사용이 필수적이지만, 자바에서는 Selenium의 연동이 조금 어렵다.
Python + BeautifulSoup / Selenium / Scrapy
- 장점
- Selenium의 처리가 조금 더 간단한 듯 하다.
- 뉴스 → 텍스트 처리(NLP) → 주식 매핑 → 시각화까지 전체 작업 흐름을 파이썬 하나로 끝낼 수 있음
- 크롤링 결과를 바로 데이터프레임, 시각화 등으로 연결하기 쉬움
- 한국어 NLP (예:
KoNLPy
,Okt
,Khaiii
) 도구가 많고 문서도 풍부함
- 단점
- 멀티스레딩 효율은 자바보다 떨어짐
asyncio
,aiohttp
쓰면 개선은 가능하다.
- 대규모 크롤링에서는 속도 느릴 수 있음
Scrapy
로 보완 가능
- 멀티스레딩 효율은 자바보다 떨어짐
🔧 라이브러리 추천 조합
🐍 Python
- 크롤링:
requests
,BeautifulSoup
,Selenium
,Scrapy
- 자연어 처리:
KoNLPy
,transformers
(BERT),Okt
,SoyNLP
- 주식 매핑:
pandas
, 직접 구축한 맵 (예: 키워드 → 종목 코드) - 시각화:
matplotlib
,seaborn
,plotly
,streamlit
(웹 기반 대시보드)
☕ Java
- 크롤링:
Jsoup
,HtmlUnit
,Selenium
(자바용) - NLP:
OpenNLP
,Stanford NLP
(하지만 설정 어려움) - 시각화: 외부 툴 또는 프론트 연동 필요 (직접 그리기 어려움)
개인적인 생각.
1. 언어
지금 프로젝트 개발에 있어서는 JAVA만을 사용한 개발 또한 불가능할 것 같지는 않다.
하지만 MSA등의 기술 활용을 통해 요즘은 개발 언어 선택으로부터 조금 더 자유롭지 않나 라고 생각한다.
추후 확장성을 생각하면 크롤링 부분은 파이썬으로 개발하는 것이 맞지 않을까 생각이 든다.
(자바를 사용하더라도 러닝커브를 마주할 일이 없다는 점에서의 나름의 장점은 있지 않을까 생각이 든다.)
2. 자연어 처리 로직 설정 부분
크롤링 할 때 자연어 처리를 해야한다면, 한글로 데이터를 수집할 것이기에
Python
사용이 불가피할 것이다.크롤링은 단순 데이터 수집으로 남겨두고 자연어 처리를 ElasticSearch에 맡긴다면, 크롤러의 언어 선택은 나름 자유로울 것 같다.
하지만… 지금 개발하는 기능과 기술들이 어떤 잠재적 제약사항을 갖고있을지 잘 모르겠다.
ps.
위의 주식 매핑, 시각화 부분은 ElasticSearch를 통해 데이터가 정제된 다음의 일일것이다.
당장 필요없지만 필요해질까봐 그냥 두었다.
📚라이브러리 상세 개요
원래 알던 내용이 아니라면 다 읽지말고 아래 표만 보는 게 정신건강에 이로울 듯 하다.
🐍 Python
1. 🥣 BeautifulSoup
✅ 특징
- 정적인 HTML 파싱에 최적화된 라이브러리
requests
와 함께 쓰는 게 일반적- 매우 가볍고 직관적
👍 장점
- 설치 간단, 문법 쉬움 (입문자용 크롤링 도구로 최고)
- HTML 문서를 쉽게 탐색하고 정보 추출 가능
- 속도가 빠름 (동적 요소만 없을 경우)
👎 단점
- 자바스크립트로 렌더링되는 동적 웹사이트는 처리 불가
- 복잡한 페이지 구조를 처리하기에는 제한적
💡 사용 예
- 네이버, 다음처럼 정적 HTML 기반 뉴스 제목, 본문 수집
2. 🧭 Selenium
✅ 특징
- 브라우저를 실제로 띄워서 사람처럼 동작하는 크롤링 도구
- 동적 렌더링되는 자바스크립트 사이트 크롤링 가능
👍 장점
- 로그인, 버튼 클릭, 무한스크롤 등 동적 웹사이트 완벽 대응
- 실제 브라우저 자동화 가능 (스크린샷, 파일 다운로드 등)
- 테스트 자동화에도 활용 가능
👎 단점
- 브라우저 실행이라 속도 느림, 리소스 많이 사용
- 대량 크롤링에는 비효율적 (단일 스레드 + 무거움)
- 설정이 번거로울 수 있음
💡 사용 예
- 네이버 뉴스 무한스크롤, 구글 뉴스에서 스크롤 내리며 수집
- 로그인 기반 웹서비스 접근 (예: 증권사 뉴스)
3. 🕸️ Scrapy
✅ 특징
- 고성능 웹 크롤링 프레임워크
- BeautifulSoup보다 빠르고, 구조적이고, 확장성이 높음
- 비동기 방식으로 대규모 크롤링에 최적화됨
👍 장점
- 매우 빠름 (비동기 처리 + 내부 최적화)
- URL 추적 및 크롤링 구조 정의 가능 (재귀 크롤링 등)
- 파이프라인을 통한 저장, 정제 등 자동화 구조 강력함
👎 단점
- 학습 난이도 존재 (프레임워크 구조를 이해해야 함)
- 단순한 작업엔 오히려 오버스펙
💡 사용 예
- 뉴스 사이트 수천 개 페이지 순회하며 수집
- 기업 데이터 크롤링 자동화 시스템
크롤링 라이브러리
항목 | BeautifulSoup | Selenium | Scrapy |
---|---|---|---|
동적 렌더링 처리 | ❌ 불가능 | ✅ 가능 | ❌ 기본은 정적 (Selenium 연동 가능) |
속도 | 🔼 빠름 | 🔽 느림 | 🔝 매우 빠름 (비동기) |
설정 난이도 | 🔰 쉬움 | ⚠️ 보통 | 🧠 중간 이상 |
대량 크롤링 | ❌ 제한적 | ❌ 부적합 | ✅ 최적화됨 |
자동화 작업 (클릭 등) | ❌ 불가 | ✅ 가능 | ❌ 기본은 불가 |
학습 난이도 | ⭐ 매우 쉬움 | ⭐⭐ 보통 | ⭐⭐⭐ 중간 이상 |
확장성 / 유지보수 | ❌ 낮음 | ⚠️ 보통 | ✅ 높음 |
상황 | 추천 도구 |
---|---|
간단한 뉴스 페이지에서 텍스트만 수집 | BeautifulSoup + requests |
스크롤, 버튼 등 동적 요소 있는 사이트 | Selenium |
수많은 페이지를 자동으로 순회하며 수집 | Scrapy |
실시간 자동화 or 브라우저 제어 필요한 경우 | Selenium |
NLP 라이브러리
도구 | 종류 | 특징 | 장점 | 단점 |
---|---|---|---|---|
KoNLPy | 라이브러리 | 다양한 한국어 형태소 분석기 모음 | 다양한 분석기 지원 (Okt, Kkma 등), 쉬운 사용 | 속도 느림, 최신 모델 부족 |
transformers (BERT) | 딥러닝 모델 | 사전학습된 한국어 BERT 사용 가능 | 문맥 이해 강력, 정밀한 의미 분석 | 무겁고 느림, GPU 권장 |
Okt (KoNLPy 포함) | 형태소 분석기 | 트위터 형태소 분석기 기반, 쉬운 사용 | 명사 추출 간편, 속도 무난 | 정확도 낮을 때 있음 |
SoyNLP | 경량 분석기 | 비지도 학습 기반, 학습 없이 명사 추출 | 속도 빠름, 사전 학습 없이 명사 추출 가능 | 문맥 분석 어려움, 띄어쓰기 한계 |
📝 간단 요약:
- 빠르게 명사만 뽑기 →
Okt
,SoyNLP
- 정확하게 문맥 파악 →
transformers
(BERT) - 여러 분석기 테스트해보고 싶다 →
KoNLPy
☕ Java
1. 🥣 Jsoup
requests
+BeautifulSoup
역할을 한 번에 하는 느낌- CSS 셀렉터 기반 파싱 (
doc.select("div.title")
) - 속도 매우 빠르고, 자바에서 HTML 다루는 데 가장 자주 사용됨
2. 🧪 HtmlUnit
- 브라우저를 띄우지 않고도 JS 실행을 흉내냄
WebClient
라는 객체를 통해 페이지 로딩- 하지만 최신 웹사이트(SPA, React 등)는 렌더링 실패할 수도 있음
3. 🧭 Selenium (Java)
- 실제
Chrome
,Firefox
브라우저를 자동 제어 - 클릭, 입력, 스크롤 등 사용자 행동 자동화 가능
- UI 테스트도 가능 (테스트 자동화와 크롤링 겸용 가능)
크롤링 라이브러리
도구 | 특징 | 장점 | 단점 | 적합한 용도 |
---|---|---|---|---|
Jsoup | HTML 파싱 전용 (정적 페이지 전용) | 빠르고 가볍다 문법 간단 | 자바스크립트 렌더링 불가 | 정적 웹사이트의 크롤링 |
HtmlUnit | 가벼운 헤드리스 브라우저 (동적 렌더링 일부 지원) | 가볍고 빠름 JS 일부 실행 가능 | 최신 JS 사이트엔 불완전 디버깅 어려움 | 간단한 동적 페이지 크롤링 |
Selenium (Java) | 실제 브라우저 자동화 도구 동적 페이지 완벽 지원 | JS 렌더링 100% 지원 사람처럼 행동 가능 | 무겁고 느림 설정 복잡 | 자바스크립트 기반 웹 크롤링 로그인, 버튼 클릭 등 자동화 |
상황 | 추천 도구 |
---|---|
정적 HTML만 수집 | ✅ Jsoup |
JS 약간 있는 간단한 동적 페이지 | ✅ HtmlUnit (성능 우선시) |
무한스크롤, 로그인, 클릭 등 복잡한 상호작용 | ✅ Selenium (Java) |
NLP 라이브러리
항목 | OpenNLP | Stanford NLP |
---|---|---|
🔧 개발사 | Apache | Stanford University |
🧠 주요 기능 | 토큰화, 품사 태깅, 문장 분리, 개체명 인식 등 | 토큰화, 품사 태깅, 구문 분석, 개체명 인식, 감정 분석 등 |
⚙️ 설정 난이도 | 비교적 쉬움 (jar만 연결하면 바로 사용 가능) | 설정 복잡 (모듈 나뉘고 모델도 별도 다운로드 필요) |
🚀 성능 | 빠르고 가볍다 | 정밀하고 정확도 높음 |
🌍 다국어 지원 | 영어 중심, 한국어 거의 없음 | 영어 중심, 한국어 약간 실험적 지원 |
🧱 커스터마이징 | 쉬운 편 (모델 재학습 가능) | 가능하지만 복잡하고 무거움 |
목적 | 추천 도구 |
---|---|
자바 기반 간단한 NLP 기능만 필요 (영어) | ✅ OpenNLP |
영어 기준으로 정밀한 NLP 분석이 필요 | ✅ Stanford NLP |
한국어 중심 NLP가 목적 | ❌ 둘 다 적합하지 않음 → 🐍 파이썬 BERT나 KoNLPy 추천 |