반응형

1. 도입 및 배경 (Why?) 💡
우리가 운영하는 에이전트가 매일 똑같은 소리만 한다면 독자들은 금방 실망할 것입니다. 😅 진정한 자동화 에이전트는 실시간 트렌드를 읽고, 뉴스나 커뮤니티의 반응을 수집하여 글의 소재로 삼아야 합니다.
하지만 요즘 대부분의 웹사이트는 '자바스크립트'로 동적 로딩이 되기 때문에, 단순한 방식으로는 데이터를 긁어올 수 없습니다.
그래서 오늘은 브라우저를 직접 조종하는 **셀레니움(Selenium)**을 활용해, 사람이 직접 웹서핑을 하는 것처럼 정교하게 데이터를 수집하는 기술을 마스터해 보겠습니다.
2. 크롤링 작동 원리 (What?) 🏗️
셀레니움은 '웹 드라이버'라는 대리인을 통해 실제 브라우저(Chrome 등)를 실행하고, 버튼 클릭이나 스크롤 같은 동작을 수행합니다.
Plaintext
[ My Python Script ] ----(명령)----> [ Chrome Driver ]
|
+-------------------------------+
|
v
[ Target Website ] <----(제어)---- [ Chrome Browser ]
|
+----(데이터 추출)----> [ 정제된 데이터 (CSV/DB) ]
3. 사전 준비: Headless 환경 구축 🛠️
우리의 서버는 화면이 없는 리눅스(CLI) 환경입니다. 따라서 브라우저를 띄우지 않고 백그라운드에서 실행하는 'Headless' 설정이 핵심입니다.
■ 필수 패키지 설치 (Ubuntu 기준)
Bash
# 1. 크롬 브라우저 설치
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb -y
# 2. 셀레니움 라이브러리 설치
pip3 install selenium webdriver-manager
4. 핵심 코드: 실시간 데이터 수집 (Step-by-Step) 🐍
이제 특정 사이트의 제목과 링크를 긁어오는 표준 코드를 작성해 보겠습니다.
■ crawler_agent.py
Python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
# 1. 크롬 옵션 설정 (서버 환경용)
chrome_options = Options()
chrome_options.add_argument("--headless") # 화면 없이 실행
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("user-agent=Mozilla/5.0 ...") # 사람처럼 보이게 설정
# 2. 드라이버 실행
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
def collect_trends(url):
try:
driver.get(url)
time.sleep(3) # 페이지 로딩 대기 (중요!)
# 3. 데이터 추출 (CSS Selector 활용)
titles = driver.find_elements(By.CSS_SELECTOR, "h3.title")
results = []
for item in titles:
results.append(item.text)
return results
finally:
driver.quit() # 자원 반납 (안 하면 서버 메모리 폭발!)
if __name__ == "__main__":
target_url = "https://news.google.com" # 예시 주소
data = collect_trends(target_url)
print(f"✅ 수집된 데이터: {data[:5]}")
5. 트러블슈팅: 당신이 마주칠 삽질 기록 🛠️
🚨 에러: SessionNotCreatedException (버전 불일치)
- 원인: 설치된 크롬 브라우저와 드라이버의 버전이 맞지 않을 때 발생합니다.
- 해결: 위 코드처럼 webdriver-manager를 사용하면 자동으로 최신 버전을 맞춰주므로 해결됩니다.
🚨 에러: 크롤링을 차단당했어요! (403 Forbidden)
- 원인: 너무 빠른 요청은 봇으로 간주되어 IP가 차단될 수 있습니다.
- 해결: time.sleep()으로 무작위 지연 시간을 주거나, User-Agent 값을 실제 브라우저 정보로 정교하게 설정해야 합니다.
🔍 더 알아보기
이 시스템과 연동되는 다른 가이드가 궁금하다면, 제 블로그 검색창에 아래 키워드를 입력해 보세요!
- "Docker" : 이 크롤러를 도커 이미지로 만들어 무중단 가동하는 법
- "Slack 알림" : 목표로 한 키워드가 발견되었을 때 즉시 알림 받는 법
- "MSSQL" : 수집된 데이터를 안전하게 DB에 저장하고 분석하는 법
. . .
반응형
'Server Story....' 카테고리의 다른 글
| 데이터의 연금술: 파이썬 Pandas로 리포트 자동 생성 및 PDF 시각화 (0) | 2026.04.06 |
|---|---|
| 24/365 무인 가동: 리눅스 크론탭(Crontab)으로 자동화 완성하기 (0) | 2026.04.03 |
| 도커(Docker)로 파이썬 에이전트 24시간 무중단 가동하기 (0) | 2026.04.03 |
| 파이썬으로 MSSQL 데이터 추출 및 자동 전처리 가이드 (0) | 2026.04.02 |
| 서버 가동률 99.9% 도전: Slack 실시간 장애 알림 시스템 구축 (0) | 2026.04.02 |